更新JLabel的文本而不更改其他所有内容

时间:2013-12-09 01:14:25

标签: java swing

标题说明了一切,我需要更新一个JLabel的文本,当然,这可以用基本方法创造奇迹,但我的''''游戏''''来自于:

no text update yet

到这个

text update

我需要阻止这种情况发生,我需要每秒更新第二张图片上标有“a”的标签文字,我最好的选择是重写paint方法并绘制一个字符串使用此代码:

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

但是字符串闪烁不停,所以现在我正在尝试更新面板中的Label文本,但是第二张图片中显示的内容相同。

我的问题是:如何在不绘制其他内容的情况下更新Label的文本?

请注意,使用JLabel(而不是抽绳)我没有使用上面发布的代码,我没有真正使用它,只是将其添加到面板中。

如果你想要一个关于这一切的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);


}
}

我希望这些信息有用。

2 个答案:

答案 0 :(得分:0)

尝试为要添加LayoutManager的组件将JLabel设置为null。此外,这些变化需要在EDT上完成。正如MadProgrammer所评论的那样,改为使用javax.swing.Timer

答案 1 :(得分:0)

试试这个

   label.setText("Value");

此方法适用于更新标签值

感谢