2

这是我的第一篇文章,所以如果我做错了什么请告诉我。我一直在研究一个小程序来获取几个节点的状态。这通过让每个节点的一个线程检查其在网络类中的正常运行时间来工作。一旦它获得节点的状态,它将把它放入一个哈希图中。然后我检查该哈希图的状态并等待其内容量等于我们正在检查的节点总数。完成后,它会继续在屏幕上显示它们。问题在于,尽管这是一个线程繁重的应用程序,但获取所有节点的状态仍然需要几秒钟。在此期间,我想显示一个带有加载栏的单独 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());
        }
    }
}
4

0 回答 0