Java 在Swing中遇到Thread.sleep问题
这个程序被编写为从0到1000计数,但它只是直接到1000,没有显示计数过程。我使用进度条和Java 在Swing中遇到Thread.sleep问题,java,swing,event-dispatch-thread,thread-sleep,Java,Swing,Event Dispatch Thread,Thread Sleep,这个程序被编写为从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.ActionEven
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();
}
}
import javax.swing.JFrame;
导入javax.swing.JButton;
导入javax.swing.JTextField;
导入javax.swing.JPanel;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
公共类项目扩展JFrame实现ActionListener{
JButton CountUpButton=新JButton(“向上计数”);
JButton CountDownButton=新JButton(“倒计时”);
JButton ResetButton=新JButton(“重置”);
JTextField NumberField=新的JTextField();
整数计数=0;
公共工程(){
setLayout(新的GridLayout(1,4));
设置大小(500300);
添加(数字字段);
添加(倒计时按钮);
添加(倒计时按钮);
添加(重置按钮);
CountUpButton.addActionListener(此);
倒计时按钮。addActionListener(此);
ResetButton.addActionListener(此);
NumberField.setText(“0”);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
@凌驾
已执行的公共无效操作(操作事件a){
if(CountUpButton.hasFocus()){
count=Integer.parseInt(NumberField.getText());
试一试{
同时(计数<1000){
计数=计数+1;
NumberField.setText(整数.toString(计数));
睡眠(100);
}
}捕捉(中断异常r){
r、 printStackTrace();
}
}
if(CountDownButton.hasFocus()){
count=Integer.parseInt(NumberField.getText());
试一试{
而(计数>0){
计数-=1;
NumberField.setText(Integer.tobinarysting(count));
睡眠(100);
}
}捕捉(中断异常r){
r、 printStackTrace();
}
}
if(ResetButton.hasFocus()){
NumberField.setText(“0”);
}
}
公共静态void main(字符串参数[]){
新项目();
}
}
任何长时间运行的任务都应该在单独的线程中运行。您使用Thread.sleep当然可以作为长期运行
通过在Swing用户界面线程中运行,在代码完成之前,无法在该用户界面中呈现任何更新。相反,您的计数应该在另一个线程中生成。另一个线程应该使用SwingWorker以线程安全的方式定期更新用户界面
学习,例如a、Swing(EDT)和SwingWorker
摆动计时器
一种更简单的方法可能是(),不要与之混淆。它将为您完成许多线程处理工作。但是我没有这方面的经验。任何长时间运行的任务都应该在单独的线程中运行。您使用Thread.sleep当然可以作为长期运行 通过在Swing用户界面线程中运行,在代码完成之前,无法在该用户界面中呈现任何更新。相反,您的计数应该在另一个线程中生成。另一个线程应该使用SwingWorker以线程安全的方式定期更新用户界面 学习,例如a、Swing(EDT)和SwingWorker 摆动计时器
一种更简单的方法可能是(),不要与之混淆。它将为您完成许多线程处理工作。但是我没有这方面的经验。任何长时间运行的任务都应该在单独的线程中运行。您使用Thread.sleep当然可以作为长期运行 通过在Swing用户界面线程中运行,在代码完成之前,无法在该用户界面中呈现任何更新。相反,您的计数应该在另一个线程中生成。另一个线程应该使用SwingWorker以线程安全的方式定期更新用户界面 学习,例如a、Swing(EDT)和SwingWorker 摆动计时器
一种更简单的方法可能是(),不要与之混淆。它将为您完成许多线程处理工作。但是我没有这方面的经验。任何长时间运行的任务都应该在单独的线程中运行。您使用Thread.sleep当然可以作为长期运行 通过在Swing用户界面线程中运行,在代码完成之前,无法在该用户界面中呈现任何更新。相反,您的计数应该在另一个线程中生成。另一个线程应该使用SwingWorker以线程安全的方式定期更新用户界面 学习,例如a、Swing(EDT)和SwingWorker 摆动计时器
一种更简单的方法可能是(),不要与之混淆。它将为您完成许多线程处理工作。但是我没有这方面的经验。这是一个猜测,但是由于JTextFields通常有一些初始值,然后由用户修改,并且不希望像这样以编程方式修改,也许您必须显式地重新绘制它?只是一个猜测,但很容易尝试,直到有人想出真正的答案。:-)
actionPerformed(…)
在UI线程中被调用,您通过调用thread.sleep(…)
来阻止它。在actionPerformed(…)
返回之前,UI无法更新。好吧,我的猜测大错特错了,对不起。Kevin的评论和Basil的回答对我来说很有意义(我有点懊恼,我没有想到它,但我已经有一段时间没有做AWT/Swing了。)这是一个大胆的猜测,但由于JTextFields通常有一些初始值,然后由用户修改,并且不希望像这样以编程方式修改,也许你必须明确地重新粉刷它?只是一个猜测,但很容易尝试,直到有人提出了真正的answ