繁体   English   中英

JButtons不会立即更改鼠标事件

[英]JButtons don't imediatly change on mouse event

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

问题在于,在人类玩家移动其动作之后,通过单击带有他要播放的棋子图像的JButton,我调用了计算机AI例程,但在鼠标事件函数内部。 通过仅在函数返回时执行此操作,计算机才结束旋转,JButton执行刷新图像(setIcon进来)。

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

我已经尝试了所有这些

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

没有用。

Thx提前

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

这是过程。

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

这意味着,如果您需要执行花费超过1/100秒左右的时间的任何操作,则不应执行任何从swing事件开始的线程。 而是生成自己的线程,并将摆动线程返回给系统,以便可以更新GUI。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM