Como atualizar um jFrame durante a execução de um método?

1 resposta
mizumoto

Pessoal,

Em um jFrame eu tenho um botão que dispara um método que demora algum tempo para terminar de executar, porém esse método atualiza uma variável que serviria para que o usuário acompanhar a sua execução.
O "POG" abaixo serve apenas para ilustrar o problema que estou tendo.
package SwingTest;

public class FrmTeste extends javax.swing.JFrame {

    public FrmTeste() {
        initComponents();
    }

    public static void metodoDemorado(){
        int i = 0;
        while(true){
            i++;
            FrmTeste.jLabel1.setText(String.valueOf(i));
        }
    }
    
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("jLabel1");

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(167, 167, 167)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(144, 144, 144)
                        .addComponent(jButton1)))
                .addContainerGap(168, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(136, 136, 136)
                .addComponent(jLabel1)
                .addGap(50, 50, 50)
                .addComponent(jButton1)
                .addContainerGap(74, Short.MAX_VALUE))
        );

        pack();
    }

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    metodoDemorado();
}

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrmTeste().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private static javax.swing.JLabel jLabel1;
}
Na linha:

         FrmTeste.jLabel1.setText(String.valueOf(i));

do método “metodoDemorado()”, o que eu gostaria de fazer era atualizar o label do jFrame com o valor da variável “i” toda vez que o seu conteúdo fosse alterado. Entretanto o texto do jLabel só será atualizado quando terminar a execução do método, ou seja, nunca, pois eu coloquei nesse método intencionalmente um loop infinito para simular uma situação de demora.

Alguém  saberia me dizer como eu faço para atualizar um jFrame durante a execução de um método segundo o exemplo acima?

Obrigado,

1 Resposta

diego2005

Você já tentou algo do tipo:

public static void metodoDemorado(){ int i = 0; while(true){ i++; FrmTeste.jLabel1.setText(String.valueOf(i)); FrmTeste.repaint(); } }

T+

Criado 13 de maio de 2009
Ultima resposta 13 de mai. de 2009
Respostas 1
Participantes 2