gpt4 book ai didi

java - 是什么导致 JLabel 不更新?

转载 作者:行者123 更新时间:2023-12-02 04:50:39 24 4
gpt4 key购买 nike

我使用观察者模式来显示轮到谁玩。我从我的 Observable 中得到了正确的数据,这就是为什么我不发布它。如您所见,正在设置文本,因为我可以调用 label.getText()。为什么标签不更新?

我尝试过重新绘制、重新验证、SwingUtilities.invokeLater、updateUI 和各种东西。我不知道我做错了什么。

提前谢谢您。

public class PlayersTurnPane extends JPanel implements Observer {

private JLabel label = new JLabel();

public PlayersTurnPane() {
setLayout(new BorderLayout());
setBackground(Color.gray);
label.setText("White");
label.setHorizontalAlignment(getWidth() / 2);
label.setFont(new Font("Serif", Font.PLAIN, 25));
add(label);

}

@Override
public void update(Observable arg0, Object arg1) {
label.setText((String)arg1); //But it will not update label
System.out.println(label.getText()); //The text is being set
}

}

我的观察

 public class TurnObserver extends Observable {

public TurnObserver(PlayersTurnPane playersTurnPane) {
addObserver(playersTurnPane);
}

public void setTurn(String turn){
setChanged();
notifyObservers(turn);
clearChanged();
}

}

我将数据发送到哪里

private TurnObserver turnObserver = new TurnObserver(new PlayersTurnPane());    

public void grabPiece(BoardTile boardTile) {
if(focusedPiece != null && playerTurn.getCurrentTurn() == focusedPiece.getPieceColor()) {
boardTile.add(focusedPiece);
updateUI();
playerTurn.changeTurn();
turnObserver.setTurn(playerTurn.getCurrentTurn());
}
}

面板已添加到此处

public class EastPanel extends JPanel {

public EastPanel() {
setLayout(new GridLayout(3,0));
add(new TimePane());
add(new MoveHistoryPane());
add(new PlayersTurnPane());
}

}

最佳答案

如果正在打印 System.out.println(label.getText()); ,那么您在未显示的代码中遇到了 Swing 线程问题,可能是由于长时间运行的代码在 Swing 事件线程上运行,阻止该线程完成其工作——例如在 JLabel 上绘制更新的文本。确保所有长时间运行的代码都在后台线程上完成,并且 Swing 状态更改和查询是在 Swing 事件线程上进行的。阅读 Concurrency in Swing了解详情。

重新,

And im being given the right data from my Observable, thats why i dont post it.

但正是那些未发布的代码才是解决问题的关键。

<小时/>

天哪,Mad 是正确的:你正在跟踪:

public TurnObserver() {
addObserver(new PlayersTurnPane());
}

您正在添加一个 PlayersTurnPane 作为观察者,但它可能不是显示的 PlayersTurnPane!关键:每次在构造函数上调用 new 时,都会创建一个 new 对象,此处为 PlayersTurnPane。您应该传入显示的 PlayersTurnPane,而不是新的。

您遇到这样的代码问题:

public class EastPanel extends JPanel {

public EastPanel() {
setLayout(new GridLayout(3,0));
add(new TimePane());
add(new MoveHistoryPane());
add(new PlayersTurnPane());
}
}

dsiplayed PlayersTurnPane 正在匿名创建 - 对象 正在添加到显示中,但该对象没有被任何变量引用,如果您要这样做,则需要执行此操作将完全相同的 PlayersTurnPane 对象传递到使其成为可观察对象的方法中。

我建议您在需要对象引用的情况下使用类字段而不是匿名对象。所以在这里,也许更好的是:

public class EastPanel extends JPanel {

public EastPanel(PlayersTurnPane playersTurnPane) {
setLayout(new GridLayout(3,0));
add(new TimePane()); // you likely need parameters for
add(new MoveHistoryPane()); // these two objects as well
add(playersTurnPane);
}
}

您似乎缺少的关键概念是引用的重要性之一,它们是指向感兴趣对象的指针。请阅读此内容。

关于java - 是什么导致 JLabel 不更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29266657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com