Search code examples
javajframejbuttonjlabel

How can I change JLabel text during work of JButton?


I would like my button 'licz' to: change text value of info to ''loading'', do something and change 'info' to "done". ('licz' is here a JButton, 'info' JLabel)

        licz.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            info.setText("Loading..."); // Here
            if(go())
            {   
                brute(0);
                info.setText("Done!"); //here
                if(odwrot)
                    JOptionPane.showMessageDialog(frame, "good");
                else
                    JOptionPane.showMessageDialog(frame, "bad");
            }
            else
            {
                JOptionPane.showMessageDialog(frame, "bad");
                info.setText("Done"); // And here
            }

        }
    });

But the program makes "something" first, changes 'info' label to "loading" and immediately to "done", how to keep these in case?


Solution

  • The event of actionPerformed is handled on the event handling thread, and should terminate fast to have a responsive GUI. Hence call invokeLater.

    licz.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            info.setText("Loading...");
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    boolean good = false;
                    if (go())
                    {   
                        brute(0);
                        good = odwrot;
                    }
                    JOptionPane.showMessageDialog(frame, good ? "good" : "bad");
                    info.setText("Done");
                }
            });
        }
    });
    

    Or in java 8:

    licz.addActionListener((e) -> {
        info.setText("Loading...");
        EventQueue.invokeLater(() -> {
            boolean good = false;
            if (go())
            {   
                brute(0);
                good = odwrot;
            }
            JOptionPane.showMessageDialog(frame, good ? "good" : "bad");
            info.setText("Done");
        });
    });