У меня есть JButton
и JLabel
. Код написан так, что когда пользователь нажимает на кнопку, выполняемое действие изменяет текст JLabel
и начинает делать некоторые вещи. Однако в действительности текст ярлыка не изменяется до тех пор, пока закончившийся материал не будет завершен.Свинг - проверка подлинности UI не происходит
Это код в кнопки действия
lbl.setText("Doing");
revalidate();
DoStuff();
текст лейбла не изменится до тех пор метода DoStuff
возврата. Я знаю, что revalidate
просто назначает вызов paint
, поэтому я думаю, что это потому, что нить краски никогда не получает срез для изменения текста.
Как исправить это?
Репродуктивная программа. Вместо DoStuff()
у меня есть while(true);
, который имитирует то же поведение. Если вы запустите эту программу, вам придется ее убить, чтобы она могла выйти.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Util1
{
public static void main(String[] args)
{
new Util1();
}
public Util1()
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ExamplePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected class ExamplePane extends JPanel
{
public ExamplePane()
{
final JPanel panel = new JPanel(new GridBagLayout());
JButton btn = new JButton("Do Stuff");
final JLabel lbl = new JLabel("Status");
add(btn);
add(lbl);
btn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
lbl.setText("Doing");
revalidate();
while(true);
}
});
}
}
}