在主线程中运行循环时显示加载JFrame

时间:2012-10-17 15:23:56

标签: java multithreading swing loops event-dispatch-thread

这是我的第一篇文章,所以如果我做错了,请通知我。 我一直在研究一个迷你applet来获取几个节点的状态。这通过让每个节点的线程检查其在网络类中的正常运行时间来工作。一旦获得节点的状态,它就会将其放入hashmap中。然后,我检查该hashmap的状态,并等待其内容量等于我们正在检查的节点总数。完成后,它会继续在屏幕上显示它们。问题是尽管使这个线程严重的应用程序获取所有节点的状态仍然需要几秒钟。在此期间,我想显示一个带加载栏的单独JFrame(如果它可以工作,甚至可以使用相同的JFrame。

我不会撒谎我是一个Java新手而且代码太可怕了,我想知道你们是否可以就我应该做些什么给我建议。这是代码。

- 主节点状态窗口 -

public NodeStatusWindow() {
    super(Managment.getTitle() + " - Nodes");
    setLayout(new FlowLayout());

    Thread threada = new Thread(new ShowLoading());
    threada.start();

    System.out.println("Checking node status...");

    Nodes.nodeOnlineCurrent.clear();

    for (int i = 0; i < Nodes.getNodes().size(); i++) {
        Object currentNode = Nodes.getNodes().keySet().toArray()[i];//

        Thread thread = new Thread(new CheckUptime((int) currentNode));
        thread.start();
    }

    while (Nodes.nodeOnlineCurrent.size() < Nodes.getNodes().size()) {
        System.out.println(Nodes.nodeOnlineCurrent.size() + " < " + Nodes.getNodes().size());
    }


    for (int i = 0; i < Nodes.nodeOnlineCurrent.size(); i++) {
        JLabel[] nodeList = new JLabel[Nodes.getNodes().size()];
        Object currentNode = Nodes.getNodes().keySet().toArray()[i];
        nodeList[i] = new JLabel("Node: " + currentNode.toString());

        nodeList[i].setOpaque(true);

        if (Nodes.nodeOnlineCurrent.get(currentNode)[0] == false) {
            nodeList[i].setForeground(new Color(255, 0, 0)); //Red
        } else if (Nodes.nodeOnlineCurrent.get(currentNode)[1] == false) {
            nodeList[i].setForeground(new Color(230, 222, 0)); //Yellow
        } else {
            nodeList[i].setForeground(new Color(0, 230, 0)); //Green
        }

        add(nodeList[i]);
    }

- 加载窗口。这个类是在上面类的threada对象中创建的 -

public class NodeStatusLoadingWindow extends JFrame {
    private static final long serialVersionUID = 1369511477485416862L;

    private JLabel status;

    public NodeStatusLoadingWindow() {
        super(Managment.getTitle() + " - Nodes");
        setLayout(new FlowLayout());

        status = new JLabel("Loading...");
        add(status);
    }

    public void closeWindow() {
        this.setVisible(false);
        this.dispose();
    }
}

这是showLoading线程

public class ShowLoading implements Runnable {
    public void run() {
        try {
            GUIHandler.drawNodeStatusLoadingWindow();
        } catch (Exception e) {
            System.out.println("Exception! " + e.toString());
        }
    }
}

0 个答案:

没有答案