有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么导致JLabel不更新?

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

我试过重新粉刷,重新验证,清洗。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());
    }

}

共 (1) 个答案

  1. # 1 楼答案

    如果正在打印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.

    但正是那些未公开的代码才是解决问题的关键


    Dang Mad是对的你在跟踪

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

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

    你会遇到这样的代码问题:

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

    dsiplayed PlayerTurnPane是匿名创建的,对象被添加到一个显示中,但是这个对象没有被任何变量引用,如果你要将完全相同的PlayerTurnPane对象传递到一个可观察的方法中,就需要这样做

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

    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);
        }
    }
    

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