假如我做了一个简单的界面,里面只有两个控件:一个按钮和一个JTextField。
程序很简单:按下那个按钮,则在JTextField中无穷地输出字母ABC,我写的是:
getstart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
while(true) {
textfca.append("ABC");
}
}
});
结果是什么也出不来。
事实上我之前做过类似的一个程序,只不过不是死循环,而是循环100次,每1秒一次。则结果居然是在100秒之后一起出现!!
请问这个是JAVA有意这样设计的还是我没有用对方法呢?
------解决思路----------------------
package com.util;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class WhileLoop extends JDialog{
WhileLoop(){
final int start = 0 ;
this.setSize(400, 300);
final JTextField text = new JTextField();
JButton button = new JButton("提交");
this.add(text, BorderLayout.NORTH);
this.add(button, BorderLayout.SOUTH);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.setVisible(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (null != text.getText()) {
// TODO Auto-generated method stub
for (int i = 0; i <= start + 1; i++) {
System.out.println(text.getText());
i=0;
}
}else{
JOptionPane.showMessageDialog(null, "text不能为空!");
return;
}
}
});
}
public static void main(String[] args) {
new WhileLoop();
}
}
------解决思路----------------------
button点击事件的响应应该用线程(Thread)处理
public void actionPerformed(ActionEvent e) {
new Runnable( new Thread(){
public void run() {
textfca.setText( textfca.getText()+"ABC");
}
}).start();
}
------解决思路----------------------
这个是因为UI的绘制都是单线程的,无论什么开发语言都一样,一般会新起线程去处理耗时的操作,然后通过事件通知进行回调绘制UI。