首页 > java swing awt, 如何实现一个按钮按下之后刷新界面

java swing awt, 如何实现一个按钮按下之后刷新界面

                    outPrint.setText("其他地方数据正在清空...");//这个没有显示
                    outPrint.repaint();//没用
                    outPrint.validate();//没用
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }

就是给个提示,正在清空,等一会(3000ms)


在UI线程sleep等待,是不会刷新界面的。

outPrint.setText("其他地方数据正在清空...");
new Thread(){
    public void run(){
        try{
          //sleep或做其它事情
        }finally{
            outPrint.setText("清空完毕");
        }
    }
}.start();

Swing是单线程事件分发机制来处理界面响应的,如果只是想等待一段时间然后刷新界面可以这样:

outPrint.setText("其他地方数据正在清空...");
EventQueue.invokeLater(new Runnable(){
    Thread.sleep(3000);
    outPrint.repaint();
});

如果要做一个比较耗费时间的操作,最好还是用SwingWorker类
通过SwingWorker的 doInBackground()方法处理费时间的任务,调用publish(...)把中间数据发布出来使得process方法可以接收到;
方法process(...) 来做中间数据的处理;
方法 done() 来做任务结束后的界面更新。

/**
     * 假设用来更新进度条,进度条的满值为100
     * @ClassName: SimActivity 
     * @Description: TODO
     *
     */
    private class SimActivity extends SwingWorker<Void,Integer>{
        private int current = 0;
        private int target = 0;
        public SimActivity(int target){
            this.target = target;
        }

        @Override
        protected Void doInBackground() throws Exception {
            //这里执行耗时的操作,例如读取文件
            try{
                while(current<target){
                    Thread.sleep(100);
                    current++;
                    publish(current);
                }               
            }catch(InterruptedException e){
            }
            return null;
        }
        @Override
        protected void process(List<Integer> chunks) {
            for(Integer chunk : chunks){
                //进度条设置值
                processBar.setValue(chunk);
            }
        }
        @Override
        protected void done() {
            //完成后的清理工作例如刷新界面或者改变某些组件的状态等
        }       
    }

使用sleep方法有时间上的不确定性,你并不能确认你最终需要执行多少时间
使用事件监听回调机制

【热门文章】
【热门文章】