gpt4 book ai didi

java - 在 GUI 上重复 controlChanges

转载 作者:行者123 更新时间:2023-12-01 09:26:15 27 4
gpt4 key购买 nike

我正在努力学习如何使用事件来更改 GUI 上的内容。我目前正在使用从另一个方法传递的 Controller 事件,我认为我可能缺少一些有关变量在这些方法中如何工作的关键信息。这是我的源代码(当前是一个内部类)。

class MyDrawPanel extends JPanel implements ControllerEventListener{

static boolean isWriting = false;

public void controlChange(ShortMessage event) {
isWriting = true;
repaint();
}

public void paintComponent(Graphics g){

if (isWriting){
int red = (int) (Math.random() * 250);
int green = (int) (Math.random() * 250);
int blue = (int) (Math.random() * 250);

g.setColor(new Color(red, green, blue));

int xpos = (int) (Math.random() * 190 + 10);
int ypos = (int) (Math.random() * 190 + 10);
int width = (int) (Math.random() * 50 + 10);
int height = (int) (Math.random() * 50 + 10);
g.fillRect(xpos, ypos, width, height);


//isWriting = false;
}

我想做的是每次监听器收到事件时绘制一个新矩形,但我只能发生两件事之一。如果我尝试在 if 语句末尾将“isWriting”设置回 false,则 if 语句似乎不断评估为 false 并且不绘制任何矩形。如果我注释掉该代码以将 isWriting 设置回 false,则绘图适用于单个矩形,但没有任何内容可以更改变量并调用重绘方法,因此我只得到一个矩形。

我知道我的事件正在到达监听器,因为每次收到事件时我都使用 sout 来增加计数,因此问题似乎出在 isWriting 变量的状态上。感谢您的帮助!

最佳答案

您希望避免在绘画方法中更改类的状态。这不是您可以完全控制的方法,因此这样做可能会导致意外且难以调试的副作用。

我不是 100% 确定你想要做什么,但是如果你尝试在每次收到消息时绘制一个新矩形,并且你希望该矩形持续存在(通过这种方式,也许显示多个矩形),然后,

  • 将矩形绘制到 BufferedImage 上,然后将 BufferedImage 显示到 JPanel 的 PaintComponent 方法中,或者
  • 创建一个包含矩形和颜色的对象的 ArrayList,然后在每个事件中创建一个新对象,将其添加到列表中,然后调用 repaint() 。然后在paintComponent 中,迭代列表来绘制矩形。
  • 不要忘记,您应该始终在覆盖中调用 super 的 PaintComponent 方法。

否则,如果您希望矩形仅显示一段时间,请使用 Swing Timer。或者,如果当用户确认收到消息时,则使用其他监听器。再次请澄清您的问题。

教程:

关于java - 在 GUI 上重复 controlChanges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39811643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com