日期:2014-05-20  浏览次数:20934 次

GUI界面刷新,在函数里和在事件监听中效果不同

如下两种方式,一种是直接写在构造方法中,实时改变TextField中的值,另一种是按下button后改变Text中的值,第一种可以实时改变,第二种就卡住了,但是在控制台仍然能输出。

一开始用的是第二种,发现不动,以为是要循环完以后再界面重绘,但是后来试了第一种发现可以改变的,这样就没法用这个解释了,请教各位大神是什么原因。


第一种实现:可以刷新

import java.util.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.*;

import javax.swing.*;
public class Main extends JFrame{
JTextField jt;
JButton jb;
Main()
{
jt=new JTextField(20);
this.add(jt);
jb=new JButton("start");
this.add(jb);

this.setLayout(new FlowLayout());
this.setSize(300, 200);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);


SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间

jb.addActionListener(new ActionListener(){

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
}

});


while(true)
{
String t=df.format(new Date());
jt.setText(t.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

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


}
}






第二种实现:不可以刷新


import java.util.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.*;

import javax.swing.*;
public class Main extends JFrame{
JTextField jt;
Main()
{
jt=new JTextField(20);
this.add(jt);


this.setLayout(new FlowLayout());
this.setSize(300, 200);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);


SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间


while(true)
{
String t=df.format(new Date());
jt.setText(t.toString());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Main main=new Main();


}
}

------解决方案--------------------
没看代码,简单看了你说的情况,估计是线程问题
http://jimmyhr.iteye.com/blog/1836514
这个文章也许有帮助。可能是你的处理在 EDT里面