[英]How do I draw something in a JPanel after I already called the paintComponent method
我是用Java制作GUI的新手。 据我了解,有一个名为Graphics的类,它负责在JPanel中绘制图形。 当我的应用程序启动时,我调用paintComponent方法,该方法绘制了我正在编程的游戏的棋盘,paintComponent方法将Graphics g作为输入。 但是,稍后,我想更新棋盘,那么当用户执行类似单击操作的操作时,如何告诉在游戏开始时绘制棋盘的同一个g绘制其他东西呢?
我相信这应该有一个非常简单的答案。
每个JComponent(Swing组件)都有一个repaint()
方法,只需调用它即可告诉DrawingManager
重绘您的组件。
您所有的绘图代码都应该在paintComponent
方法中,这意味着您不会在其他任何地方绘制任何东西(您只能在paintComponent
的调用流程中进行绘制,您当然可以在方法中构造绘图代码)。
该方法需要访问指示应该绘制什么和绘制位置的状态。 这是因为OS可以请求重新绘制,然后仅调用JComponent
中的绘制方法。
当您在JComponent
上调用repaint()
时,绘图线程将在短时间内调用您请求对其进行重绘的组件的paintComponent()
方法,并且您仅应在此绘图线程中进行绘制。
尝试repaint()或revalidate(),它应该可以工作。
我称之为paintComponent方法
不,您永远不要直接调用paintComponent()方法。 需要重绘组件时,Swing将为您调用该方法。
我想更新板子
然后,您需要一个“ setter”方法。 考虑其他Swing组件。 它们具有“ setForeground(),setBackground(),setText()”等方法。
因此,如果要更改组件,则需要创建适当的setter方法来更改类的属性。 然后,在方法中保存属性并仅调用repaint()
,Swing将重新绘制组件。 因此,现在您的paintComponent()方法需要检查刚刚设置的属性以进行适当的绘制。
public void setSomeProperty(Obect someProperty)
{
this.someProperty = someProperty;
repaint();
}
....
protected void paintComponent(Graphics g)
{
super.paintComponent();
// paint the board
if (someProperty != null)
// paint the property
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.