我有一个使用Netbeans的GUI构建器创建的JFrame,它只包含一个JPanel。我创建了一个方法getPanel
来获取对这个JPanel的引用:
public class ShowDrawings extends JFrame {
public ShowDrawings() {
initComponents();
}
public JPanel getPanel(){
return panel;
}
private JPanel panel;
}
在我的主要功能中:
public class Main {
public static void main(String[] args){
ShowDrawings sd = new ShowDrawings();
sd.setSize(800, 600);
Graphics g = sd.getPanel().getGraphics();
g.setColor(Color.BLACK);
g.drawOval(400, 300, 50, 50);
sd.getPanel().paint(g);
sd.repaint();
sd.setVisible(true);
}
}
但它没有任何吸引力。请帮我。
我查看了一些相关问题,但他们都建议扩展JPanel
并覆盖其paint
方法。但我不想这样做。
感谢。
答案 0 :(得分:5)
我看了一些相关的问题,但他们都在暗示 扩展
JPanel
并覆盖其paint
方法。但我不想要 这样做
您不应该覆盖JPanel
paint()
方法,而应覆盖paintComponent(..)
。这是最佳实践,如果您希望代码不会产生异常,则应该这样做。在你当前的方法中做到这一点(正如你所看到的那样)使得创建持久性绘图变得更加困难,因为它们在repaint()
上消失了
相反延伸JPanel
并覆盖paintComponent(Graphics g)
,并且忘记在重写的super.paintComponent(g)
方法中调用paintComponent(..)
作为第一次调用。另外,请不要忘记覆盖getPreferredSize()
的{{1}},以便我们可以返回正确的维度,JPanel
可以调用pack()
(+1到@mKorbels评论):
以下是一些示例代码:
JFrame
答案 1 :(得分:3)
第一次repaint()
ShowDrawings sd
帧时,您所绘制的任何内容(sd.getPanel().getGraphics().drawOval(...)
)都会被原始JPanel#paintComponent()
方法删除。
作为Andrew Thompson has written:
不要使用Component.getGraphics()。相反,子类化并覆盖paint()(AWT)或paintComponent()(Swing)方法。
Component.getGraphics()根本无法工作。 Java使用回调机制绘制图形。您不应该使用getGraphics()将图形信息“推送”到组件中。相反,您应该等到Java调用 paint()/ paintComponent()方法。那时你应该为Component提供你想要的图纸。
如果您只是检查/调试某些内容,您甚至可以执行以下操作:
class Test {
private JPanel panel = new JPanel() {
public void paintComponent(Graphics g) {
g.setColor(Color.BLACK);
g.drawOval(400, 300, 50, 50);
}
};
}