2009-08-22 203 views
2

我需要通過覆蓋JPanel的paintComponent()方法在JPanel上繪製圖形。在JPanel上繪圖並將JPanel添加到JFrame中

當我通過JFrame拖放一個JPanel來設計使用NetBeans的GUI時,它通過創建一個私有變量JPanel對象來生成代碼。在這種情況下,我怎麼能覆蓋它的方法來繪製它...

否則,如果我通過擴展JPanel編寫類的代碼並重寫繪製它的方法,我必須創建一個新的JFrame和添加JPanel到它..

JFrame fr = new JFrame(); fr.add(pane); //窗格是擴展JPanel的類的對象,其中我繪製了 fr.setVisible(true);

在這種情況下,它的工作原理..

但是,如果我得到它通過NetBeans的擴展JFrame中自動創建類的參考和使用,使用引用的add方法添加的JPanel了它doesn」將不起作用......

class x extends JPanel 
{ 
     paintComponent(Graphics g){   //overridden method 

      //my code for drawing say lines goes here.. 
      } 
} 

class y extends Thread 
{ 
     z obj; 

     y(z obj){ 

      this.obj=obj; 
      } 
     public void run(){ 

       x pane=new x(); 
       pane.setVisible(true); 
       obj.add(pane); 
       obj.setVisible(true);   //im not getting the pane visible here.. if i created a new JFrame class here as i said earlier and added the pane to it i can see it.. 
      } 
} 

class z extends JFrame 
{ 
      z(){//code generated by netbeans} 

      public static void main(String args[]) 
      { 


        new y(new z()).start(); 
      } 
} 

這表明沒有錯誤,但是當我運行該程序只JFrame中可見..不顯示的JPanel ...

原諒我,如果這個問題是愚蠢的..即時通訊初學者..

在此先感謝...

回答

2

行爲你的代碼是不可預測的,因爲你違反了Swing開發的主要原則:所有UI的工作應該在事件指派線程來完成(EDT )。您的代碼應該是這個樣子:

public static void main(String args[]) { 
    SwingUtilities.invokeLater(new Runnable() { 
     void run() 
     { 
      JFrame z = new JFrame(); 
      z.add(new X()); // works only in java 6 
      //z.getContentPane().add(new X()); // works in any version of java 
      z.pack(); // assuming your pane has preferred size 
      z.setVisible(true); 

     } 
    }); 
} 

更多的主題是在這裏: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

1

您的代碼非常混亂。不管怎麼說,而不是

obj.add(pane); 

你需要

obj.getContentPane().add(pane); 
-1

這聽起來像你正在使用Swing的初學者。但是,使用庫JXLayer可以使組件上的繪畫非常容易和直觀。

查看他們的演示和示例代碼。

否則,優秀的JFreeChart是一個偉大的,免費的Java圖形(和可視化)庫