JButton不会立即更改鼠标事件

时间:2010-05-13 23:02:19

标签: java

我正在使用java swing库开发一款名为DAO的棋盘游戏。

问题在于,在人类玩家移动之后,通过点击他想要播放的片段图像的JButton,我调用计算机AI例程但在鼠标事件功能内部。通过仅在函数返回时执行此操作,计算机结束其转动,JButtons刷新其图像(setIcon进入)。

我想知道如何强制JButtons在单击它们时更改它们的图像,而不仅仅是当鼠标事件函数结束时(因为我需要处理其中的数据)。

我已经尝试了所有这些

                    myButtons[i][j].setIcon(xIcon);
                    myButtons[i][j].revalidate();
                    myButtons[i][j].repaint();
                    myButtons[i][j].validate();

没有工作。

提前谢谢

2 个答案:

答案 0 :(得分:1)

所有Swing活动都有一个线程。

这是过程。

  • 事件队列中出现一个事件
  • 从队列中拉出并由The AWT Thread
  • 执行
  • 执行此操作时创建的任何新事件都将放在要保留的队列中,直到当前正在运行的AWT事件返回。
  • 事件执行返回,队列中的下一个事件出列并执行。

这意味着如果你需要做任何超过1/100秒左右的事情,你不应该做任何从swing事件开始的线程。相反,产生自己的线程并将swing线程返回给系统,以便更新GUI。

现在,你的线程绝不能更新任何GUI对象!如果需要更新GUI对象,请使用invokeLater将代码放回AWT线程。

不符合此规则并在AWT线程上执行任务的新Java程序员几乎肯定是人们认为Java速度缓慢的最大原因。

答案 1 :(得分:1)

您可能想尝试将点击JButton时执行的操作放入Swing工作人员。这将允许任务在后台继续,而用户仍然可以单击其他按钮等。

请参阅http://java.sun.com/docs/books/tutorial/uiswing/concurrency/simple.html