gpt4 book ai didi

Java 事件调度线程被阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:47 25 4
gpt4 key购买 nike

我正在尝试在程序执行期间更改JLabel 的文本。我知道程序执行会阻塞 EDT,因此我使用计时器来完成这项工作。但是计时器仅在循环完成执行后启动,尽管 timer.start() 在源代码中位于循环之前。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.Timer;


@SuppressWarnings("serial")
public class TestUpdate extends JFrame {

JLabel lab;
JButton btn;

public TestUpdate() {
super("Update test");
setDefaultCloseOperation(EXIT_ON_CLOSE);

btn = new JButton();
btn.setText("Start test");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Timer tm = new Timer(1, new ActionListener() {
public void actionPerformed(ActionEvent e) {
lab.setText("Text is successfully changed");
lab.repaint();
}
});
tm.setRepeats(false);
tm.setInitialDelay(0);
tm.start();
long startTime=System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis()-startTime >= 3000) break;
try {Thread.sleep(500);} catch (InterruptedException e1) {}
}
lab.setText("Three seconds elapsed");
btn.setEnabled(false);
}
});
add(btn,"South");

lab = new JLabel("Should be changed before 3 seconds elapsed");
lab.setHorizontalAlignment(SwingConstants.CENTER);
add(lab);

setSize(300, 200);
setLocationRelativeTo(null);
setVisible(true);

}



public static void main(String[] args) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {new TestUpdate(); } });
}

}

最佳答案

计时器事件由 EDT 执行,因此第一个事件将在当前任务(带有 while 循环的操作监听器代码)完成时执行。这就是您观察到此类行为的原因。

关于Java 事件调度线程被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080901/

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