Java 在Swing中遇到Thread.sleep问题

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

这个程序被编写为从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();
    }
}
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