これは私の最初の投稿なので、何か間違ったことをしている場合はお知らせください。いくつかのノードのステータスを取得するためのミニアプレットに取り組んできました。これは、ネットワーククラスで稼働時間をチェックする各ノードのスレッドを持つことによって機能します。ノードのステータスを取得すると、それをハッシュマップに入れます。次に、そのハッシュマップのステータスをチェックし、そのコンテンツ量がチェックしているノードの合計量と等しくなるまで待ちます。完了すると、画面に表示されます。問題は、これを高度にスレッド化されたアプリケーションにしたにもかかわらず、すべてのノードのステータスを取得するのにまだ数秒かかることです。この間、読み込みバーを使用して別の 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());
}
}
}