gpt4 book ai didi

Java:即使使用 SwingUtilities.invokeLater,线程也不会修改 GUI

转载 作者:行者123 更新时间:2023-12-01 10:00:54 28 4
gpt4 key购买 nike

我对这段代码有疑问:

public class Gui_01 extends JFrame {

private JPanel display;
private ActionListener visualizza() {
ActionListener evento = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

display.removeAll();

Thread t = new Thread(new Runnable() {
public void run() {
JPanel visualizza = new JPanel();
visualizza.add(new JLabel("Test", SwingConstants.CENTER));

display.add(visualizza, BorderLayout.SOUTH);

updateProgress(visualizza);
}
}
);

t.start();
}
};
return evento;
}

private void updateProgress(final JPanel visualizza) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
display.add(visualizza, BorderLayout.SOUTH);
}
});
}}

我不明白为什么代码不能正常工作,线程 t 和 updateProgress 中的线程工作正常,但任何显示修改都不会影响 GUI,即使使用 invokeLater。

display.add(visualizza, BorderLayout.SOUTH)

这段代码不会修改gui,我知道这是正常的(由于Swing),但为什么invokeLater不起作用。

抱歉我的英语不好,提前感谢您的回复。

最佳答案

首先删除线程中的 display.add(visualizza, BorderLayout.SOUTH); 语句。因为您永远不应该从 EDT 上下文之外更新或修改 UI...

Thread t = new Thread(new Runnable() {
public void run() {
JPanel visualizza = new JPanel();
visualizza.add(new JLabel("Test", SwingConstants.CENTER));

//display.add(visualizza, BorderLayout.SOUTH);

updateProgress(visualizza);
}
}

事实上,我不鼓励您在 EDT 之外创建 UI 元素,因为您无法保证它们何时开始与 UI 交互。

其次,在更新 UI 后调用 revalidaterepaint...

private void updateProgress(final JPanel visualizza) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
display.add(visualizza, BorderLayout.SOUTH);
display.revalidate();
display.repaint();
}
});
}}

Swing 在更新 UI 方面很懒,这是一件好事,因为它允许您进行彻底的更改,并且仅在您准备好时才更新 UI。

我还鼓励您改用 SwingWorker,因为它具有可用于将更新与 EDT 同步的功能。请参阅Worker Threads and SwingWorker了解更多详情

关于Java:即使使用 SwingUtilities.invokeLater,线程也不会修改 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818049/

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