JLabel自定义事件setText

问题描述 投票:1回答:1

所以,我有两个类,一个是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参数提供它则不行。

提前致谢。

java swing jlabel
1个回答
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上执行。

© www.soinside.com 2019 - 2024. All rights reserved.