Drawing a circle into a Jframe

15,533

Draw a circle by overridding paint / paintComponent (if using swing)

public void paintComponent(Graphics g) {
  g.drawOval(0,0,50,50);
}

To draw custom circles, you can use a (Buffered)Image to draw on first

public class DrawCircles extends JPanel {
  Image im = new BufferedImage(...);
  public void drawCircle(int x, int y) {
    im.getGraphics().drawOval(x,y,50,50); //TODO: should really dispose the Graphics object after drawing the oval
    repaint();
  }

  public void paintComponent(Graphics g) {
    g.drawImage(im,0,0,null);
  }
}
Share:
15,533
Dragongeek
Author by

Dragongeek

Behold! Me profile! Feast yer eyes upon it, 'n ye shall see, 'tis barren.

Updated on June 04, 2022

Comments

  • Dragongeek
    Dragongeek almost 2 years

    I’m trying to draw a small circle into a gray square JFrame as an indicator of stick positions for an RC remote.

    I’ve got two classes:

    public class GUI2 extends JFrame {
    
    private JPanel contentPane;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI2 frame = new GUI2();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public GUI2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(0, 0));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        StickWidget Left = new StickWidget();
        Left.setName("Left Stick");
        Left.drawCircle(10, 10);
        contentPane.add(Left.draw(), BorderLayout.EAST);
        StickWidget Right = new StickWidget();
        Right.setName("Right Stick");
        contentPane.add(Right.draw(), BorderLayout.WEST);
        }
    }
    

    And I’ve got a second class:

    public class StickWidget extends JPanel {
    
    private javax.swing.JPanel panel_1;
    private String NameOfStick;
    private int xpos;
    private int ypos;
    
    public void initcomponents()
    {
    panel_1 = new javax.swing.JPanel();
    }
    
    public StickWidget() {
        //do nothing?
    }
    
    public Component draw()
    {
        initcomponents();
        JPanel main = new JPanel();
        main.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
        Dimension D1 = new Dimension(120, 150);
        main.setMinimumSize(D1);
        main.setMaximumSize(D1);
        main.setPreferredSize(D1);
        main.setSize(D1);
        main.setLayout(new MigLayout("", "[grow]", "[grow][grow]"));
        JPanel panel = new JPanel();
        main.add(panel, "cell 0 0,grow");
    
        JLabel StickName = new JLabel(NameOfStick);
        panel.add(StickName);
    
    
        panel_1.setBackground(Color.LIGHT_GRAY);
        Dimension d = new Dimension(100, 100);
        panel_1.setMinimumSize(d);
        panel_1.setMaximumSize(d);
        main.add(panel_1, "cell 0 1,grow");
        return main;
    }
    
    public void drawCircle(int x, int y)
    {
        Graphics2D g2d = (Graphics2D)panel_1.getGraphics();
        g2d.fillOval(x, y, 10, 10);
    }
    public void setName(String s)
    {
        NameOfStick = s;
    }
    

    }

    The current program draws the GUI just fine however when I attempt to run the drawCircle() it falls apart and gives me errors. I’m not sure what I’ve done wrong, I don’t have a lot of experience with 2d drawing.

    So my questions:

    -Is this the right approach to this? -How can I get the drawCircle to draw circles within the gray Jframes?

    Error Message:

    java.lang.NullPointerException
    at experiments.StickWidget.drawCircle(StickWidget.java:59)
    at experiments.GUI2.<init>(GUI2.java:44)
    at experiments.GUI2$1.run(GUI2.java:23)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745)
    at java.awt.EventQueue.access$300(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:706)
    at java.awt.EventQueue$3.run(EventQueue.java:704)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:715)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)