如何在GUI中的一个事件中多次更新组件内容

问题描述:
       在一个鼠标/键盘事件多次添加组件或删除组件或修改组件的属性值只有在整个事件完成后界面才会刷新。
       例如有一个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++;
		}
		
	}
	
}

解决方法:
       综上,组件在界面中不能更新的原因是因为事件没有结束。那么可以让事件开始时另起一个线程,然后事件就结束。把修改组件的代码放在另一个线程中执行即可。经本人测试,这种方法可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值