JLabel自定义事件setText

时间:2019-02-27 18:14:40

标签: java swing jlabel

因此,我有两个类,一个是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参数,则无法使用。

谢谢。

1 个答案:

答案 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上执行该方法。