为什么setText没有更新JLabel?

Ale*_*man 0 java swing jlabel settext

我在这里检查了其他线程,但没有找到解决方案.

1)JFrame是setVisible(true).

2)这意味着什么:"我想知道你的问题是否是一个并发问题,你是在Swing事件线程上进行长时间运行的进程,这是在阻止你的标签更新其文本." 我在其他地方读到了.

3)我没有多次初始化包含标签的JPanel.

编辑:4)从包含TrackingPanel(即gamePanel)的JPanel调用updateTurn .我调用方法changeTurns();,这是代码:

public void changeTurns() {
    if(turnPlayer == playerX)
        turnPlayer = playerO;
    else
        turnPlayer = playerX;

    trackingPanel.updateTurn();
}   
Run Code Online (Sandbox Code Playgroud)

以下是完整的相关代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TrackingPanel extends JPanel{

    /*TURN STUFF*/
    private JPanel turnPanel; //turns panel to keep track of whose turn it is
    private JLabel turnLabel;
    private String turn;

    /*OTHER*/
    private GamePanel gamePanel;


    public TrackingPanel( GamePanel gamePan ) {

        setLayout( new GridLayout(1,4) );
        setBorder(BorderFactory.createMatteBorder(2,2,4,2,Color.BLACK));

        gamePanel = gamePan;

        /*THIS PANEL DISPLAYS THE TEXT*/
        turnPanel = new JPanel( new GridLayout(2,1) );
        turn = gamePanel.getPlayerTurn().getLetter();
        turnLabel = new JLabel("      Player " + turn + "'s turn");
        add( turnPanel);

    }//end constructor

    /*THIS IS WHERE THINGS GO WRONG*/
    public void updateTurn() {

        turn = gamePanel.getPlayerTurn().getLetter();
        turnLabel.setText( "      Player" + turn + "'s turn" );
        System.out.println(turn);
    }
}
Run Code Online (Sandbox Code Playgroud)

之前updateTurn()被称为turnLabel"PlayerX轮流".之后,它应该说"PlayerO轮到"了.通过打印输出turn(我得到字符串'O',而不是'X'),我知道显示的是什么("PlayerX轮到")不是应该显示的内容("PlayerO轮到").

在此先感谢您的smartypants!

编辑.尝试提供SSCCE但不知道如何包含图像文件.抱歉!

小智 7

试试这个:

 private void setText(final JLabel label, final String text){
    label.setText(text);
    label.paintImmediately(label.getVisibleRect());
 }
Run Code Online (Sandbox Code Playgroud)

  • 这完全符合我的需要,因为我之后立即运行了挂起功能. (2认同)