如果绘制JOptionPane,则不会绘制我的面板组件

时间:2017-09-27 15:36:02

标签: java swing user-interface joptionpane

所以我有一个类,它在第一次单击武器按钮时创建以下GUI: enter image description here

我点击的一侧的每个按钮都应相应地切换到另一个面板。但是,目前,我正在研究武器专家组。为了节省内存,我决定保存搜索框中输入的内容,如果用户决定再次打开面板,应用程序会再次搜索列表。目前,我只有一个名为test的项目,我的问题是如果我在搜索框中输入内容,那是不可用的,我切换面板,这是我的结果:

enter image description here

预期结果应该是错误消息,但是在搜索框中,按钮和JList仍然可用,JList显示" No Weapons Listed"。

现在当我删除JOptionPane时,我得到以下结果的一半:

enter image description here

我想知道为什么当出现错误消息时未显示面板?

PS:我输入了一些控制台消息,一个在Joptionpane之后,另一个在return语句之前,它们都正确打印

以下是我的面板代码:

    private static JPanel searchMenu() {

    JPanel pnl = new JPanel();
    pnl.setOpaque(false);
    pnl.setLayout(new BorderLayout());

    Object[] search = search();

    if(search.length == 0) {
        JOptionPane.showMessageDialog(MyFrame.getFrame(), 
                  "No weapons with your search criteria has been found.\n"
                + "What you type in the search box is searched for in the weapon names, classnames and their description.\n", 
                "No Weapon found", JOptionPane.ERROR_MESSAGE);

        search = new Object[] {"No Weapons listed"}; 
    }

    System.out.println(search.length);

    DefaultListModel list = new DefaultListModel();
    for(Object o: search) list.addElement(o);

    JList searched = new JList();

    searched.setModel(list);
    searched.setPreferredSize(new Dimension(250, 700));
    searched.setFont(new Font("Tahoma", Font.PLAIN, 15));

    pnl.add(searched, BorderLayout.WEST);

    pnl.add(weaponDisplay(lastSelec),BorderLayout.CENTER);

    JPanel space = new JPanel();
    space.setOpaque(false);
    pnl.add(space,BorderLayout.SOUTH);

    return pnl;
}

2 个答案:

答案 0 :(得分:2)

看起来你在之后将组件添加到容器已经可见了。至少,您需要validate()封闭容器,如here所示,并可能调用repaint()。更好的方法是添加视图组件,例如JList,布局并更新其模型,例如ListModel,视需要而定。在此example中,JList会收听附近桌子的模型。

答案 1 :(得分:0)

JOptionPane的对话框是模态的,因此它们会停止执行调用代码,直到对话框关闭为止。因此,您希望首先填充并显示列表,其中包含"未列出任何武器"作为其内容,在显示消息对话框之前。