【问题标题】:JPanel Graphics clearing and repainting?JPanel 图形清除和重绘?
【发布时间】:2011-10-17 16:22:20
【问题描述】:

我有一个 JPanel 和一个 paintComponent() 函数。我会调用一次,然后当用户单击不同的JButton 时,我会设置一些标志并想再次调用此函数,因为在设置标志后它会做一些稍微不同的事情。

所以这就是我想知道的:我如何从paintComponent 中清除现有的东西?要重绘,我是否只需再次调用paintComponent

目前我正在尝试以下方法:

flag2 = true;
repaint(); //I expect (want) paintComponent to be called again

在绘画组件中,我做的事情如下:

if (flag2==true) {
    g.drawRect(...);
} else {
    g.drawLine(...);
}

但是通过测试,我的工作似乎有问题。

感谢您的帮助。

【问题讨论】:

  • 你不是从paintComponent方法中调用repaint(),是吗?您确定 repaint() 调用与您要刷新的面板相关联吗? (例如 myPanel.repaint())?

标签: java swing graphics jpanel paintcomponent


【解决方案1】:

要清除所有先前绘制的图形,请调用g.clearRect(0, 0, getWidth(), getHeight())

【讨论】:

    【解决方案2】:

    我建议调用 revalidate();而不是重绘()。 revalidate() 需要在更改大小/布局或在 jpanel 上添加/删除对象时调用,并将更新它的所有子项。据我所知,您仍在使用相同的绘制对象,但更改了它的布局。

    【讨论】:

      【解决方案3】:

      当您更改面板的属性时,您需要调用:

      panel.repaint();
      

      使组件被重新绘制。

      那么paintComponent()方法中的第一条语句应该是:

      super.paintComponent(g);
      

      这将绘制背景,因此您现在可以进行自定义绘制。

      如果您需要更多帮助,请发布您的 SSCCE 来说明问题。

      【讨论】:

        【解决方案4】:

        首先,为什么不使用枚举而不是布尔值?

        enum Enum { 
            RECTANGLE,
            LINE,
            CIRCLE
        }
        
        Enum choice = RECTANGLE; //default to RECTANGLE
        
        switch(choice) { 
           // case RECTANGLE, LINE, CIRCLE
        }
        

        关于你的问题,你能回答我的问题吗?

        【讨论】:

        • 我的逻辑很好,我可能可以使用枚举,但无论如何这不是我的问题。我的问题是我需要清除所有绘制的图形,然后以某种方式再次为此 JPanel 调用paintComponent。
        • 你应该不需要清除所有图形来实现你想要的。
        • 查看 camickr 的回答,如果您没有按照他的概述进行操作,请先关注这一点。
        猜你喜欢
        • 2011-11-15
        • 2017-08-31
        • 1970-01-01
        • 2012-04-29
        • 1970-01-01
        • 2015-07-12
        • 2022-01-20
        • 1970-01-01
        • 2012-08-03
        相关资源
        最近更新 更多