gpt4 book ai didi

java - Swing - UI 重新验证未发生

转载 作者:行者123 更新时间:2023-12-01 11:33:45 24 4
gpt4 key购买 nike

我有一个JButton和一个 JLabel 。编写代码是为了当用户单击按钮时,执行的操作会更改 JLabel 的文本。并开始做一些事情。然而,实际上,标签文本在正在完成的事情完成之前不会改变。

这是按钮操作中的代码

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

}
}
}

最佳答案

问题是,public void actionPerformed(ActionEvent ae) 方法中的操作在 Swing 线程中执行。直到执行完所有操作后才会显示更改。例如,您可以在另一个线程中执行 doStaff 方法。更多详情请参见this topic 。我也遇到了同样的问题。

关于java - Swing - UI 重新验证未发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30206390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com