因此,我有两个类,一个是Observer
,一个是Observable
。
可观察对象有一个char variable
,它会被更改,更改后,ChangeTurnListener
事件将被触发,它使用onChangeTurn()
方法,并将char变量作为参数传递。
一切正常,观察者中存在char变量,但JLabel似乎不更新文本。我尝试使用repaint()
,但不走运。还尝试在JLabel上使用paintImmediately()
,它会出现一秒钟,然后出现Disapperas。
我想做的很简单:
@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中的并发性有关。
如果我只是将Text设置为随机文本,则可以使用,但是如果我为其提供了whoMove参数,则无法使用。
谢谢。
答案 0 :(得分:0)
正如@Oleksandr在其评论中指出的那样。在Java Swing 应用程序中,即使用javax.swing
包中的类的应用程序,例如JLabel
,将启动一个特殊线程。该线程有很多名称,包括 Event Dispatch Thread (事件调度线程)或EDT。正如@Oleksandr指出的那样,必须在该线程上执行调用类setText()
中的方法JLabel
的代码。提到的类@Oleksandr-javax.swing.SwingUtilities
-还包含[静态]方法isDispatchThread()
,如果从EDT调用则返回true。如果未从EDT调用,则可以在类invokeLater()
中调用方法SwingUtilities
,该方法也将确保在EDT上执行该方法。