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 符号)