在构造函数加载时显示加载栏

时间:2014-04-06 00:09:44

标签: java swing

在我的java类中,我在其构造函数的jtable中填充~10000个值。因此,加载需要时间,应用程序类型会挂起,直到数据加载。我想显示一个带有加载标志的JLabel来显示状态。但问题是装载标志后加载标志也显示出来。请帮帮我。我的代码看起来像这样。

class myClass{

     myClass(){
         Loading.setVisible(true);
         // LOAD ~ 10000 values in the jtable

     }


}

1 个答案:

答案 0 :(得分:1)

有很多可行的方法可以做到这一点。这是其中之一。

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class Test extends JPanel {
    private JLabel         progressLabel  = new JLabel("0 %");
    private HeavyProcessor heavyProcessor = new HeavyProcessor();

    private static class HeavyProcessor extends Thread {
        private volatile int currentStatus = 0;

        @Override
        public void run() {
            for (int i = 0; i <= 100; i++) {
                currentStatus++;

                try {
                    Thread.currentThread().sleep(1000);
                } catch (InterruptedException e) {
                }
            }
        }

        public int getStatus() {
            return currentStatus;
        }
    }

    public Test() {
        this.add(progressLabel);
        this.heavyProcessor.start();

        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        progressLabel.setText(String.valueOf(heavyProcessor.getStatus()) + " %");
                    }
                });
            }
        }, 0, 1000);
    }

    public static void main(String[] args) {
        JFrame window = new JFrame("Progressbar");
        window.setSize(200, 200);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(new Test());
    }
}

在自己的线程中正在进行困难的操作。在计算期间(或其他任何方式),它会更新描述当前状态的内部变量。 GUI的实现包含一个计时器,它定期(每秒)从第二个线程获得有关当前状态的值,然后更新标签。