JPanel不可见

时间:2016-07-04 17:51:34

标签: java swing user-interface jpanel jsch

我的程序出现了问题一直让我发疯,我无法理解为什么会这样。我有一个GUI,当"添加"按下按钮,会出现一个新的系统列表(这是一个名为SystemPanel的类,它扩展了JPanel并且系统详细信息,创建然后放入Frame的主面板。)

简而言之,当我尝试添加新的SystemPanel时,它不会出于任何原因。我有使用JSch的代码连接到系统并验证其进程是否在线,但执行此操作的代码行是在创建SystemPanel之后。只有在执行系统进程测试代码后,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函数获取用户的输入并使用它们连接到系统并确定进程是否正常工作,并将结果返回到布尔数组中,true表示工作,false表示不工作。

甚至更奇怪的是,我的程序的另一部分是从.ini文件读取以获取现有系统,然后根据它读取的数据创建SystemPanels。通过这种方法,SystemPanels以我想要的方式添加并且由于某种原因完美地工作,即使添加面板的代码几乎没有任何不同。代码:

    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。在这里,所有的SystemPanel都会在测试连接之前添加并显示出来,这正是我在正常添加一个时想要发生的事情。

为什么在测试连接之前SystemPanel不会出现,即使在连接测试之前执行显示SystemPanel的代码?非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

尝试当前事件队列处理,在其上完成actionPerformed。

public void actionPerformed(ActionEvent e) {
    EventQueue.invokeLater(() -> { ... your code here ... });
}

此外,您无法将相同的组件添加到两个父级,每个组件对象都有一个父级(容器)。

(Java 8表示法)