Reputation: 7129
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?
Upvotes: 0
Views: 187
Reputation: 109547
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");
});
});
Upvotes: 1