【问题标题】:How can I force Jpanel to immediately repaint in Java?如何强制 Jpanel 立即用 Java 重新绘制?
【发布时间】:2017-05-13 06:35:26
【问题描述】:

这是我的代码

boolean boo = true;

ItemListener itemListener = new ItemListener() {
    public void itemStateChanged(ItemEvent event) {
        boo= false;         
        aSwingObj.repaint();
        boo = true;
     }
}

我希望 repaint() 方法在 boo 设置为 false 时运行,在它变为 true 之前。

问题是 repaint() 函数只有在变量 boo 再次设置为 true 后才会执行。我尝试过其他方法,如 revalidate()、validate(),但没有奏效。我应该如何修复我的代码?

【问题讨论】:

  • 你有一个设计问题。 itemStateChanged 只是一个事件。在那里它不应该两次改变变量的状态。也许你需要一个计时器。所以你设置状态,绘制组件,然后几秒钟后重置状态?

标签: java swing repaint


【解决方案1】:

这是XY problem。您不想强制 JPanel 立即重新绘制。您想在绘画开始之前立即进入特定状态,并在绘画结束后立即退出该状态。

实现这一点的一种方法实际上是进入该状态,当场强制重新绘制,然后退出该状态。但正如您所见,这有点难以完成。

因此,另一种方法是创建一个执行 extend JPanel 的新类(或 aSwingObj 的任何类),以便您可以覆盖 paintComponent() 方法并使其在绘制完成后退出您的特殊状态.

所以,扩展 JPanelpaintComponent() 方法如下所示:

 @Override
 public void paintComponent( Graphics g ) 
 {
        super.paintComponent( g );
        resetBoo();
 }

其中resetBoo() 是一个执行boo = true; 的方法

【讨论】:

  • (1-) 您无法控制何时调用 paintComponent() 方法。因此,绘画方法不应该改变对象的状态,只绘画当前状态。
  • @camickr 从OP提供的代码来看,状态只对绘制的代码感兴趣,所以应该没问题。无论如何,如果您能提供更好的解决方案,我将删除我的答案。如果不是,我的答案是正确的,因为它确实提供了一个可以满足 OP 需求的解决方案。
  • judging by the code provided - OP 不了解 Swing 绘画的工作原理,因此存在设计问题。如果不完全了解需求,我们就无法提供合适的解决方案。
  • @camickr 是的,我想这是一个“XYZ 问题”。
  • I suppose it is an "XYZ problem". - 是的,正如你在第一句话中所说的那样。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
相关资源
最近更新 更多