我的程序一直遇到问题,这让我发疯,我不明白为什么会发生这种情况。我有一个GUI,当按下"添加"按钮时,会出现一个新的系统列表(这是一个称为SystemPanel的类,它扩展了JPanel并包含系统详细信息,该类被创建然后放入框架的主面板中。
简而言之,当我尝试添加新的系统面板时,无论出于何种原因,它都没有出现。我有使用 JSch 的代码连接到系统并验证其进程是否在线,但执行此操作的代码行是在创建 SystemPanel 之后。只有在执行用于测试系统进程的代码后,SystemPanel 才变得可见,我不明白为什么会这样。以下是添加新系统面板的代码:
public void actionPerformed(ActionEvent e) {
//If the "Add" button is pressed
if (e.getActionCommand() == "Add") {
PopupWindow popup = new PopupWindow(this);
popup.setVisible(true);
String[] results = popup.getResults();
if (results[0] != null && results[1] != null && results[2] != null && results[3] != null && results[4] != null) {
SystemPanel newSystem = new SystemPanel(this, results[0], results[1], results[2], results[3], results[4]);
systemsPanel.add(newSystem);
revalidate();
systemsList.add(newSystem);
System.out.println("Did the stuff");
boolean[] status = SystemChecker.checkOnline(results[0], results[1], results[2], results[3]);
}
}
}
PopupWindow是一个自定义的JDialog,允许用户输入所需的信息,这些信息在字符串数组中返回,并用于创建新的系统面板。checkOnline 函数获取用户的输入并使用它们连接到系统并确定进程是否正常工作,并将结果返回到布尔数组中,true 表示工作,false 表示不工作。
更奇怪的是,我的程序的另一部分从.ini文件中读取以获取现有系统,然后根据它读取的数据创建系统面板。通过这种方法,系统面板以我想要的方式添加,并且由于某种原因完美运行,即使添加面板的代码几乎没有任何不同。法典:
for (int i = 0; i < systems.size(); i++) {
SystemPanel newSystem = new SystemPanel(this, systems.get(i)[0], systems.get(i)[1], systems.get(i)[2], systems.get(i)[3], systems.get(i)[4]);
systemsPanel.add(newSystem);
revalidate();
systemsList.add(newSystem);
}
for (int i = 0; i < lineNum; i++) {
boolean[] status = SystemChecker.checkOnline(systems.get(i)[0], systems.get(i)[1], systems.get(i)[2], systems.get(i)[3]);
systemsList.get(i).updateIcons(status);
}
此代码从文件中获取详细信息,然后基于这些详细信息创建系统面板。在这里,所有系统面板都被添加并显示在连接测试之前,这就是我正常添加一个时想要发生的事情。
为什么系统面板直到测试连接才出现,即使显示系统面板的代码是在连接测试之前执行的?任何帮助将不胜感激,谢谢。
尝试当前事件队列处理,在该处理上执行 actionPerform。
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(() -> { ... your code here ... });
}
此外,您不能将同一组件添加到两个父级,每个组件对象都有一个父级(容器)。
(Java 8 表示法)