我需要通过覆盖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没有显示...
请原谅我,如果问题很愚蠢......我是初学者......
提前致谢...
答案 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图形(和可视化)库