已有101人关注
关于java窗体中显示动态文本的问题
发表在Java图书答疑 2020-04-13 悬赏:1 学分 《零基础学Java》第11章 Swing程序设计
是否精华
版块置顶:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test extends JFrame {

  public Test() {
    setBounds(400, 200, 200, 150);// 设置窗体大小及位置
    setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗体退出游戏
    setLayout(null);// 设置绝对布局
    // 标签
    JLabel test = new JLabel("初始值");
    test.setBounds(50, 20, 100, 30);
    add(test);
    // 开始按钮
    JButton start = new JButton("开始");
    start.setBounds(40, 60, 70, 30);
    add(start);
    // 为开始按钮添加鼠标点击动作监听事件
    start.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
	new Thread() {
	  public void run() {
	    Random ran = new Random();
	    for (int i = 1; i < 30; i++) {// 执行30次循环
	      test.setText(ran.nextInt(30) + 1 + "");// 更换test文本内容点数
	      try {
		Thread.sleep(50);// 线程暂停50毫秒
	      } catch (InterruptedException e) {
		e.printStackTrace();
	      }
	    }
	  }
        }.start();
      }
    });
  }
  public static void main(String[] args) {
    new Test().setVisible(true);// 新建窗体并使窗体可见
  }
}

以上代码,实现在窗体中点击开始按钮后,test标签框动态改变30次随机数的文本内容,运行后没有问题,监听事件中用的是多线程方法。

现在的问题是,如果把监听事件中的多线程方法去掉,部分代码改成:

	@Override
	public void actionPerformed(ActionEvent e) {
		Random ran = new Random();
		for (int i = 1; i < 30; i++) {// 执行30次循环
			test.setText(ran.nextInt(30) + 1 + "");// 更换test文本内容点数
			try {
				Thread.sleep(50);// 线程暂停50毫秒
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
		}
	}

运行后再点击开始按钮,发现窗体面板会卡住一会,等监听事件中的方法运行结束后,面板才恢复正常,中途test标签内容并没有显示出变换的动作,最后标签内容为最后一个随机数值。

请问这是为什么,难道这里一定要用多线程才可以?或是还有其它办法解决?


2020-04-14 08:26:12编辑
分享到:
精彩评论 1
根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2020-04-15
沙发

必须新建线程,你在监听器里使用spleep只会让当前程序的主线程休眠,主线程休眠就啥也不干了,也不会实时渲染窗体,所以会卡。应该让主线程做显示,另一个线程做计算,这样才能看到滚动数字。

首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照