关于swing中组件的动态刷新问题

问题描述:Java Swing中,界面刷新是线程同步的,也就是说同一时间,只有一个线程能执行刷新界面的代码。如果要多次不断地刷新界面,必须在多线程中调用刷新的方法。

解决思路:

//主线程中的代码   当点击按钮时会执行 actionPerformed中的代码  。
在buttonActionPerformed方法中多次调用了setText方法来试图刷新JLabel。
buttonActionPerformed方法运行在主线程中,所以每次调用setText都是运行在主线程中,而且是顺序的执行的。在前面几次调用setText后,线程并没有退出,所以界面刷新线程不能获得执行刷新的机会。而当最后一次setText后,线程退出,界面才能执行刷新。所以我们只能看到最后一次setText的值。
因此,要解决这个问题,我们必须把buttonActionPerformed方法中的代码段放到一个单独的线程中执行。这样它就不会使线程阻塞,当每次setText后,界面刷新线程也能得到执行的机会,从而刷新界面。

// 相关主要代码如下
jb = new JButton("按钮");
jl = new JLabel("init", JLabel.CENTER);
jb.addActionListener(this);
this.add(jb, BorderLayout.NORTH);
this.add(jl, BorderLayout.CENTER);
this.setVisible(true);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
 
this.setBounds(0, 0, 400, 400);      
//
if (e.getActionCommand().equals("按钮")) {  // TODO Auto-generated method stub 
 new Thread(new Runnable() {
 public void run() { while(true){
 System.out.println("please input the message");
  InputStreamReader isr=new InputStreamReader(System.in);
  BufferedReader br=new BufferedReader(isr); String str=""; 
 try { str = br.readLine(); 
 } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
 jl.setText(str);  } } }).start(); // 启动线程
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值