首页 > 解决方案 > 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 参数,它就不行。

提前致谢。

标签: javaswingjlabel

解决方案


正如@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 上执行的类中调用。


推荐阅读