gpt4 book ai didi

java - 在 Swing 中遇到 Thread.sleep 问题

转载 作者:行者123 更新时间:2023-12-01 22:05:16 24 4
gpt4 key购买 nike

这个程序本来是从 0 到 1000 进行计数的,但它只是直接到 1000,而不显示计数过程。我使用进度条和 Thread.sleep() 方法编写了类似的代码,并且效果很好。

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JPanel;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class project extends JFrame implements ActionListener {

JButton CountUpButton = new JButton("Count up");
JButton CountDownButton = new JButton("Count Down");
JButton ResetButton = new JButton("Reset");
JTextField NumberField = new JTextField();
int count = 0;

public project(){
setLayout(new GridLayout(1, 4));
setSize(500, 300);
add(NumberField);
add(CountUpButton);
add(CountDownButton);
add(ResetButton);
CountUpButton.addActionListener(this);
CountDownButton.addActionListener(this);
ResetButton.addActionListener(this);
NumberField.setText("0");
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);

}

@Override
public void actionPerformed(ActionEvent a){
if(CountUpButton.hasFocus()){
count = Integer.parseInt(NumberField.getText());
try{
while(count < 1000){
count = count + 1;
NumberField.setText(Integer.toString(count));
Thread.sleep(100);
}
}catch(InterruptedException r){
r.printStackTrace();
}
}
if(CountDownButton.hasFocus()){
count = Integer.parseInt(NumberField.getText());
try{
while(count > 0){
count -= 1;
NumberField.setText(Integer.toBinaryString(count));
Thread.sleep(100);
}
}catch(InterruptedException r){
r.printStackTrace();
}
}
if(ResetButton.hasFocus()){
NumberField.setText("0");
}
}

public static void main(String args[]){
new project();
}
}

最佳答案

任何长时间运行的任务都应该在单独的线程中运行。您对 Thread.sleep 的使用当然符合长时间运行的条件。

通过在 Swing 用户界面线程中运行,在代码完成之前不会在该用户界面中呈现任何更新。相反,您的计数应该在另一个线程中生成。该另一个线程应该使用 SwingWorker 以线程安全的方式定期更新用户界面。

学习launching threads , executors例如 ScheduledExecutorService , Swing event-dispatch thread (美国东部时间)和 SwingWorker。

Swing 计时器

更简单的方法可能是 Swing Timer class ( Tutorial ),不要与 java.util.Timer 混淆。它将为您完成大部分线程处理工作。但我没有这方面的经验。

关于java - 在 Swing 中遇到 Thread.sleep 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32919853/

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