【问题标题】:How do I draw something in a JPanel after I already called the paintComponent method调用paintComponent方法后如何在JPanel中绘制一些东西
【发布时间】:2016-05-20 11:27:59
【问题描述】:

我是使用 Java 制作 GUI 的新手。据我了解,有一个名为 Graphics 的类负责在 JPanel 中绘制形状。当我的应用程序启动时,我调用paintComponent 方法,该方法绘制我正在编程的游戏的棋盘,而paintComponent 方法将Graphics g 作为输入。但是,稍后,我想更新棋盘,那么当用户执行诸如单击之类的操作时,如何告诉在游戏开始时绘制棋盘的同一个 g 来绘制其他内容?

我相信这应该有一个非常简单的答案。

【问题讨论】:

标签: java swing user-interface graphics


【解决方案1】:

每个 JComponent(Swing 组件)都有一个 repaint() 方法,只需调用它来告诉 DrawingManager 重绘您的组件。

你所有的绘图代码都应该在paintComponent方法中,这意味着你不会在其他任何地方绘制任何东西(你只在paintComponent的调用流中绘制,你当然可以在方法中构造绘图代码)。

此方法需要访问指示应绘制什么和在何处绘制的状态。这是因为操作系统可以请求重新绘制,然后只调用来自JComponent的绘制方法。

当您在JComponent 上调用repaint() 时,您请求重绘的组件的paintComponent() 方法将很快被绘图线程调用,并且您应该只在此绘图线程中绘图。

【讨论】:

    【解决方案2】:

    尝试 repaint() 或 revalidate(),它应该可以工作。

    【讨论】:

    • 什么是repaint()方法?我是否必须覆盖层次结构中更高的一些 void repaint() 方法?
    • 当你添加一些东西时,你调用 repaint() 方法告诉程序你已经添加了一些新元素,所以在你的操作结束时,插入 repaint();
    【解决方案3】:

    我调用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
    }
    

    【讨论】:

    • 这是我害怕不得不做的事情。是否可以避免在 paintComponent 方法中放置大量 if 语句?
    • 对您的游戏了解不足,无法提出任何其他建议。关键是您了解绘画的工作原理,然后提出自己的解决方案。也许你的游戏有“游戏棋子”,它们被绘制在不同的方格上。然后在这种情况下,您可能会保留一个 ArrayList 游戏片段。然后您的绘画代码将遍历 ArrayList 并绘制每个游戏片段。所以无论你有 1 块还是 100 块,绘制的逻辑都是一样的。您只需要一个方法来从列表中添加/删除游戏。
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2011-06-26
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多