2015-07-10 49 views
2

我試圖畫一個小圓圈成一個灰色的方形JFrame作爲RC遙控器的控制桿位置的指示器。將一個圓圈繪製成一個Jframe

我有兩類:

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); 
    } 
} 

而且我有一個第二類:

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; 
} 

}

當前程序提請GUI就好了但是當我試圖運行drawCircle()它分崩離析,並給我錯誤。我不確定我做錯了什麼,我沒有很多2d繪圖的經驗。

所以我的問題:

這-Is正確的方法呢? - 我怎樣才能讓drawCircle在灰色的Jframe中繪製圓圈?

錯誤消息:

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) 
+0

您能否包含錯誤? – maskacovnik

+1

@maskacovnik我添加了它 – Dragongeek

回答

2

通過overridding漆/的paintComponent繪製圓(如果使用擺動)

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

繪製定製的圈子裏,你可以使用(緩衝)圖像上繪製第一

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); 
    } 
} 
0

調試問題儘量把代碼:

public void drawCircle(int x, int y) 
{ 
    if(panel_1==null){ 
     System.err.println("Panel is null"); 
     return; 
    } 
    Graphics2D g2d = (Graphics2D)panel_1.getGraphics(); 
    if(g2d==null){ 
     System.err.println("Graphics is null"); 
     return; 
    } 
    g2d.fillOval(x, y, 10, 10); 
} 

我會使用Canvas而不是JPanel來繪製圖形。