java - JLabel 自定义事件 setText
问题描述
所以,我有两个类,一个是 the Observer
,一个是Observable
. observable 有一个char variable
,它被改变了,当它改变时,ChangeTurnListener
事件被触发,它的onChangeTurn()
方法,以及将该 char 变量作为参数传递。
一切正常,char 变量存在于观察者中,但 JLabel 似乎没有更新文本。我试过使用repaint()
,没有运气。还尝试paintImmediately()
在 JLabel 上使用,它会出现一秒钟,然后消失。
我想做的很简单:
@Override
public void onChangeTurn(String whoseMove) {
System.out.println("OnChangeTurn ran");
System.out.println("WhoseMove passed through onChangeTurn: " + whoseMove);
jlTurn.setText("It's your turn " + whoseMove);
}
我已经意识到这是 JLabel 的问题,所以我尝试firePropertyChanged(...)
在 JLabel 上使用,仍然没有运气。
我认为这可能与 Java Swing 中的并发性有关。
如果我只是将 setText 设置为随机文本,它就可以工作,但如果我为它提供 whoMove 参数,它就不行。
提前致谢。
解决方案
正如@Oleksandr 在他的评论中指出的那样。在 java Swing应用程序中,即使用javax.swing
包中的类的应用程序,例如JLabel
,启动一个特殊线程。这个线程有很多名字,包括Event Dispatch Thread或 EDT。setText()
正如@Oleksandr 所指出的,您在类中调用方法的代码JLabel
必须在此线程上执行。@Oleksandr 提到的类 - javax.swing.SwingUtilities
- 还包含 [static] 方法isDispatchThread()
,如果从 EDT 调用该方法返回 true。如果没有从 EDT 调用,那么您可以调用 method invokeLater()
,也可以在SwingUtilities
确保它将在 EDT 上执行的类中调用。
推荐阅读
- r - 如何使用 TDA 包为固定半径构建 alpha 形状复合体?
- intellij-idea - Intellij 覆盖构造函数快捷键
- python - 简化代码。我的工作,但看起来像地狱一样丑陋
- jquery - jquery focus() 对输入不起作用,试图检查是否点击了输入,等待输入,或者没有
- c# - LINQ 表达式 'DbSet
\n .Where(c => __res_RelatedContacts_0\n.Any(r => r.IdVal.Equals(c.ContactId)))' 无法翻译 - bokeh - 散景:无法从存储在 CDSView 中的数组中渲染线条(jupyter notebook,来自 Pandas 数据框的 CDS)
- excel - 如何从具有布尔值的多变量表中创建动态列表?
- python - 将二维椭圆拟合到点
- archlinux - 如何使用 kickstart.cfg 虚拟安装 kvm Centos 8
- java - 查看绑定导致“指定的孩子已经有父母”