绘制JPanel并将JPanel添加到JFrame

时间:2009-08-22 13:57:25

标签: java graphics jframe jpanel paint

我需要通过覆盖JPanel的paintComponent()方法在JPanel上绘制图形。

当我在JFrame上拖放JPanel时使用netbeans设计gui时,它通过创建私有变量JPanel对象来生成代码。在这种情况下,我如何覆盖其方法来绘制它......

或者如果我通过扩展JPanel并覆盖方法来绘制它来编写类的代码,我必须创建一个新的JFrame并将JPanel添加到它...

JFrame fr = new JFrame(); fr.add(窗格); // pane是类的对象,它扩展了我绘制的JPanel fr.setVisible(真);

在这种情况下,它有效..

但是如果我得到自动创建的类的引用,它通过netbeans扩展JFrame并使用它来添加JPanel使用引用的add方法得到它不起作用...

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没有显示...

请原谅我,如果问题很愚蠢......我是初学者......

提前致谢...

3 个答案:

答案 0 :(得分: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 :(得分:1)

您的代码几乎被混淆了。无论如何,而不是

obj.add(pane); 

你需要

obj.getContentPane().add(pane); 

答案 2 :(得分:-1)

听起来你是一个使用Swing的初学者。但是,使用库JXLayer可以非常简单直观地绘制组件上的绘图

查看他们的演示和示例代码。

否则,优秀的JFreeChart是一个很棒的免费Java图形(和可视化)库