JPanel 不可见
JPanel not visible
我的程序一直有问题,这让我发疯,我不明白为什么会这样。我有一个 GUI,当按下 "Add" 按钮时,会出现一个新的系统列表(这是一个名为 SystemPanel 的 class,它扩展了 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,它允许用户输入所需的信息,这些信息以 String 数组的形式返回,用于创建一个新的 SystemPanel。 checkOnline 函数获取用户的输入并使用它们连接到系统并确定进程是否在工作,并将结果 returns 放入布尔数组中,true 表示工作,false 表示不工作。
更奇怪的是,我的程序的另一部分从 .ini 文件读取以获取现有系统,然后根据读取的数据创建 SystemPanel。通过这种方法,系统面板以我想要的方式添加并且由于某种原因完美地工作,即使添加面板的代码几乎没有什么不同。代码:
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);
}
此代码从文件中获取详细信息,然后根据这些详细信息制作 SystemPanel。在这里,所有的 SystemPanels 都被添加并在连接测试之前显示出来,这是我正常添加一个时想要发生的事情。
为什么显示SystemPanel的代码是在连接测试之前执行的,但要等到连接测试才出现SystemPanel?非常感谢任何帮助,谢谢。
试试当前的事件队列处理,actionPerformed在其上完成。
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(() -> { ... your code here ... });
}
同样不能将同一个组件添加到两个父对象,每个组件对象都有一个父对象(容器)。
(Java 8 符号)
我的程序一直有问题,这让我发疯,我不明白为什么会这样。我有一个 GUI,当按下 "Add" 按钮时,会出现一个新的系统列表(这是一个名为 SystemPanel 的 class,它扩展了 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,它允许用户输入所需的信息,这些信息以 String 数组的形式返回,用于创建一个新的 SystemPanel。 checkOnline 函数获取用户的输入并使用它们连接到系统并确定进程是否在工作,并将结果 returns 放入布尔数组中,true 表示工作,false 表示不工作。
更奇怪的是,我的程序的另一部分从 .ini 文件读取以获取现有系统,然后根据读取的数据创建 SystemPanel。通过这种方法,系统面板以我想要的方式添加并且由于某种原因完美地工作,即使添加面板的代码几乎没有什么不同。代码:
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);
}
此代码从文件中获取详细信息,然后根据这些详细信息制作 SystemPanel。在这里,所有的 SystemPanels 都被添加并在连接测试之前显示出来,这是我正常添加一个时想要发生的事情。
为什么显示SystemPanel的代码是在连接测试之前执行的,但要等到连接测试才出现SystemPanel?非常感谢任何帮助,谢谢。
试试当前的事件队列处理,actionPerformed在其上完成。
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(() -> { ... your code here ... });
}
同样不能将同一个组件添加到两个父对象,每个组件对象都有一个父对象(容器)。
(Java 8 符号)