繁体   English   中英

我已经调用paintComponent方法后如何在JPanel中绘制内容

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM