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