问题描述:
在一个鼠标/键盘事件多次添加组件或删除组件或修改组件的属性值只有在整个事件完成后界面才会刷新。
例如有一个JLabel,将JLabel的text设置为0,然后点击键盘,text的值变为1,间隔一秒后,text的值变为2,但是界面显示的是text的值直接从0变为2,我们是看不到变化的过程,只能看到变化的结果。
在这变化的一秒钟里,界面是锁定的,按钮不能点击。
代码如下,可自行尝试
public class MyFrame extends JFrame{
MyFrame(){
this.setSize(300, 300);
this.setLocation(100, 100);
//一行两列的网格布局
getContentPane().setLayout(new GridLayout(1,2));
//添加一个标签
MyLabel myLabel = new MyLabel();
getContentPane().add(myLabel);
//标签获得焦点
myLabel.requestFocus();
//添加一个按钮
getContentPane().add(new JButton("按钮"));
}
public static void main(String[] args) {
new MyFrame().setVisible(true);
}
}
public class MyLabel extends JLabel{
public static int a = 0;
MyLabel(){
this.setFont(new Font(null, 1, 20));
//设置label的显示值
this.setText("" + a);
a++;
this.setHorizontalAlignment(CENTER);
this.setBackground(Color.gray);
this.setOpaque(true);
this.setFocusable(true);
this.addKeyListener(new KeyMonitor());
}
class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
setText("" + a);
a++;
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
setText("" + a);
a++;
}
}
}
解决方法:
综上,组件在界面中不能更新的原因是因为事件没有结束。那么可以让事件开始时另起一个线程,然后事件就结束。把修改组件的代码放在另一个线程中执行即可。经本人测试,这种方法可行。