所以,我有两个类,一个是Observer
,一个是Observable
。 observable有一个char variable
,它被改变,当它被改变时,ChangeTurnListener
事件被激发,使用它的onChangeTurn()
方法,并将该char变量作为参数传递。
一切都很好,char变量存在于观察者中,但JLabel似乎没有更新文本。我尝试过使用repaint()
,没有运气。还尝试在JLabel上使用paintImmediately()
,它会短暂出现,然后消失。
我想做的很简单:
@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的一个问题,所以我尝试在JLabel上使用firePropertyChanged(...)
,但仍然没有运气。
我假设这可能与Java Swing中的并发性有关。
如果我将setText设置为随机文本,它就有效,但如果我使用whichMove参数提供它则不行。
提前致谢。
正如@Oleksandr在评论中指出的那样。在java Swing应用程序中,即使用javax.swing
包中的类的应用程序,如JLabel
,将启动一个特殊的线程。这个线程有很多名称,包括Event Dispatch Thread或EDT。正如@Oleksandr指出的那样,在类setText()
中调用方法JLabel
的代码必须在此线程上执行。 @Oleksandr提到的类--javax.swing.SwingUtilities
- 也包含[静态]方法isDispatchThread()
,如果从EDT调用,则返回true。如果没有从EDT调用,那么你也可以在类invokeLater()
中调用方法SwingUtilities
,它确保它将在EDT上执行。