gpt4 book ai didi

java - EDT-挥杆问题

转载 作者:行者123 更新时间:2023-12-01 06:39:53 24 4
gpt4 key购买 nike

我有一个在 EDT 内执行的方法。事情是这样的:

myMethod()
{
System.out.prinln(SwingUtilities.isEventDispatchThread());

for (int i = 0; i < 10; i++)
{
Thread.sleep(3000);
someJPanel.remove(otherJPanel);
}
}

我预计会发生什么:十个 JPanel 将从其父级中一一删除,每次删除之间有三秒的暂停...

实际发生了什么:一切都卡住了 30 秒,之后 10 个元素全部被移除。

控制台中的行始终为 true (SwingUtilities.isEventDispatchThread())。

由于我是在 EDT 中完成所有这些操作,为什么更改没有立即完成?为什么它要等待该方法首先到达其末尾?

我应该如何更改代码才能实现删除之间的三秒延迟?

最佳答案

Swing 使用单个线程来分派(dispatch)事件并处理重绘请求。每当您阻止此线程时,您都会停止 EDT 处理这些重绘请求,从而使 UI 看起来像是“已停止”。

相反,使用类似javax.swing.Timer的东西插入延迟并执行操作。这将在 EDT 内执行操作,但将在后台线程中等待。

通读一下The Event Dispatching Thread欲了解详情...

更新了计时器示例

public class SlowDecline {

public static void main(String[] args) {
new SlowDecline();
}
private TestPane last;

public SlowDecline() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

TestPane parent = new TestPane(Color.RED);
TestPane tp = add(parent, Color.BLUE);
tp = add(tp, Color.GREEN);
tp = add(tp, Color.CYAN);
tp = add(tp, Color.LIGHT_GRAY);
tp = add(tp, Color.MAGENTA);
tp = add(tp, Color.ORANGE);
tp = add(tp, Color.PINK);

last = tp;

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(parent);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (last != null) {
Container parent = last.getParent();
if (parent != null) {
parent.remove(last);
parent.repaint();
if (parent instanceof TestPane) {
last = (TestPane) parent;
}
} else {
last = null;
}
} else {
(((Timer)e.getSource())).stop();
}
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
});
}

public TestPane add(TestPane parent, Color color) {

TestPane child = new TestPane(color);
parent.add(child);
return child;
}

public class TestPane extends JPanel {

public TestPane(Color background) {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(10, 10, 10, 10));
setBackground(background);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
}

关于java - EDT-挥杆问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149242/

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