不改变其他内容,更新JLabel的文本

4

标题已经说明一切,我需要更新JLabel的文本。当然,基本方法已经运作良好了,但我的“游戏”却从以下状态:

no text update yet

变成了这样:

text update

我需要阻止这种情况发生,我需要每秒更新第二张图片上说“a”的标签文本。我的最佳选择是覆盖绘制方法并使用以下代码绘制字符串:

public void paint(Graphics g){

        super.paint(g);


        g.setColor(Color.BLACK);

        g.drawString("Arca: " + administrador.getCiudad().getArca() 
                + "                                    " 
                + " Puntos de Belleza: " + administrador.getCiudad().getPuntosBelleza() + 
                "                                    " + 
                " Habitantes: " + 
                administrador.getCiudad().getCantidadHabitantes() + " / " 
                + administrador.getCiudad().getCantidadHabitantesDisponibles(), 400, 45);

            repaint();
}

但字符串不停闪烁,因此我尝试在面板内更新标签的文本,但是出现了第二张图片中显示的相同问题。

我的问题是:如何更新标签文本而不使其重新绘制其他内容?

请注意,如果使用JLabel(而不是drawstring),则我不使用上面发布的代码,实际上我什么都不用做,只需将其添加到面板中即可。

如果您需要关于这个问题的SSCCE,您可以使用以下内容:

public class GUIJuego extends JFrame{

private JLabel labelConstrucciones = new JLabel("Construcciones");
private JLabel labelEstados = new JLabel(" ");

public GUIJuego(){

    JPanel panelConstruccion = new JPanel(new GridLayout(9,1));
    JPanel panelDatosCiudad = new JPanel(new GridLayout(1,2));
    JPanel panelMapa = new JPanel(new GridLayout(25,25));
    JPanel panelEstado = new JPanel(new FlowLayout()); 

    administrador = new Administrador(new Ciudad(), 0, new Dificultad(this.getMultiplicadorDificultad()), new Constructora());

    administrador.administrar(this);

    panelDatosCiudad.add(panelEstado);
    panelEstado.add(labelEstados);

    Timer timer = new Timer(10, new ActionListener(){
        public void actionPerformed(ActionEvent e){
            labelEstados.setText("Arca: " + administrador.getCiudad().getArca() 
                    + "                                    " 
                    + " Puntos de Belleza: " + administrador.getCiudad().getPuntosBelleza() + 
                    "                                    " + 
                    " Habitantes: " + 
                    administrador.getCiudad().getCantidadHabitantes() + " / " 
                    + administrador.getCiudad().getCantidadHabitantesDisponibles());
        }

    });

    timer.start();
    }
}

// Timer which updates the JLabel's values along with its class

public class Administrador {

private Ciudad ciudad;
private int contadorExplosion;
private Dificultad dificultad;
private Constructora constructora;
private TimerTask taskJuego;

public void administrar(GUIJuego juego){

    Timer timer = new Timer("Juego");

    taskJuego = new TimerTask(){
        public void run() {

            if((getCiudad().getArca() < 100000 && getCiudad().getArca() > 0) && getCiudad().getPuntosBelleza() < 1000 && getCiudad().getCantidadHabitantes() < 1000){

                getEgresosIngresos();
                tryExplotar();

            } else if(getCiudad().getArca() >= 100000 || getCiudad().getPuntosBelleza() >= 1000 || getCiudad().getCantidadHabitantes() >= 1000){

                this.cancel();
                JOptionPane.showMessageDialog(null, "¡Ganaste!");

            } else if(getCiudad().getArca() <= -1000) {

                this.cancel();
                JOptionPane.showMessageDialog(null, "¡Perdiste!");

            }
        }
    };

    timer.scheduleAtFixedRate(taskJuego, 0, 1000);


}
}

我希望这些信息对你有用。

请将您的SSCCE翻译成英文,谢谢。 - tbodt
panelConstruccion = 建筑面板 panelDatosCiudad = 城市数据面板 panelMapa = 地图面板 panelEstado = 城市状态面板administrador = 管理员,一个处理某些功能的对象,例如提取城市的输入和输出,就像税务官一样。oh,administrar = 管理。ciudad = 城市,在那里你有所有建筑物堆积成一个漂亮的大数组列表arca = 整数变量,你在城市内拥有多少钱puntos belleza = “美丽点”,只是赢得游戏的要求而已habitantes = 居民 - krieg
不要在任何绘制方法内部调用repaint或可能导致repaint被调用的任何方法。 - MadProgrammer
1
不要使用TimerTask来更新UI,而是使用javax.swing.Timer。请查看Swing中的并发性获取详细信息。 - MadProgrammer
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/42762/discussion-between-krieg-and-madprogrammer - krieg
显示剩余3条评论
2个回答

0
尝试将 LayoutManager 设置为 null,以便为添加 JLabel 的组件进行更改。此外,这些更改需要在 EDT 上执行。如 MadProgrammer 所述,使用 javax.swing.Timer 替代。

0

试一下这个

   label.setText("Value");

这个方法适用于更新标签值

谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接