【发布时间】:2013-04-14 11:25:09
【问题描述】:
我正在努力完成这项工作。我创建了一个带有一个文本字段和按钮的窗口,然后运行 run() 方法,该方法应该刷新文本字段中的文本,当我单击按钮时,它应该将数字迭代 1。我想同时进行这项工作,但我被卡住了。它只是迭代数字但不刷新文本字段中的值。你能帮我吗?我认为它很容易学习线程,但是......没有:-D 这是代码。
窗口类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Okno extends JFrame implements ActionListener,Runnable {
private JFrame o = new JFrame();
private static JTextField t = new JTextField();
private JTextField t2 = new JTextField();
private static int x = 0;
protected JButton b = new JButton("KLIK");
Okno() {
o.setVisible(true);
o.setBounds(0, 0, 300, 200);
o.setLayout(null);
o.setDefaultCloseOperation(EXIT_ON_CLOSE);
t.setBounds(10, 10, 60, 20);
t2.setBounds(80, 10, 60, 20);
b.setBounds(50, 80, 60, 30);
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
while (true) {
Okno.work();
System.out.println("Klik");
}
}
});
o.add(t);
o.add(b);
o.add(t2);
}
public static int iter(){
x++;
return x;
}
public static void work(){
try {
iter();
System.out.println(x);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
}
@Override
public void run() {
while(true){
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText(Integer.toString(x));
System.out.println("RUN");
}
}
}
主类
public class ThreadDemo {
public static void main(String args[]) {
Okno o = new Okno();
while(true){
o.run();
}
}
}
【问题讨论】:
-
您的代码通过尝试在后台线程上进行 Swing 调用并在 Swing 事件线程上调用
Thread.sleep(...)来忽略 Swing 线程规则。使用 Swing 计时器(根据答案)或使用 SwingWorker 以确保 Swing 方法调用仅在 Swing 事件线程上进行。您应该能够找到涵盖此内容的教程。 -
感谢D先生的建议!我坚持了几个小时,这可能会解决问题。
标签: java multithreading swing