有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JPanel上绘制并将JPanel添加到JFrame

我需要通过重写JPanel的paintComponent()方法在JPanel上绘制一个图

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

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

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

在这种情况下,它是有效的

但是,如果我得到一个自动创建的类的引用,该类通过netbeans扩展JFrame,并使用该引用的add方法添加JPanel,那么它就不起作用了

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) 个答案

  1. # 1 楼答案

    你的代码相当混乱。无论如何,而不是

    obj.add(pane); 
    

    你需要

    obj.getContentPane().add(pane); 
    
  2. # 2 楼答案

    听起来你是个挥杆初学者。然而,使用库JXLayer使得在组件上绘制变得非常简单和直观

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

    否则,优秀的JFreeChart是一个伟大的、免费的Java绘图(和可视化)库

  3. # 3 楼答案

    代码的行为是不可预测的,因为您违反了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