Java 我的小组';如果绘制了JOptionPane,则不会绘制s组件

Java 我的小组';如果绘制了JOptionPane,则不会绘制s组件,java,swing,user-interface,joptionpane,Java,Swing,User Interface,Joptionpane,因此,我有一个类,它在第一次单击武器按钮时创建以下GUI: 我点击的一侧的每个按钮都应该相应地切换到不同的面板。然而,目前,我只是在武器小组工作。为了节省内存,我决定保存搜索框中键入的内容,如果用户决定再次打开面板,应用程序将再次搜索列表。目前,我只有一个名为test的项目,如您所见,我的问题是如果我在搜索框中键入了不可用的内容,并且我切换了面板,这是我的结果: 预期结果应该是错误消息,但搜索框、按钮和JList仍然可用,JList显示“未列出武器” 现在,当我删除JOptionPane时,

因此,我有一个类,它在第一次单击武器按钮时创建以下GUI:

我点击的一侧的每个按钮都应该相应地切换到不同的面板。然而,目前,我只是在武器小组工作。为了节省内存,我决定保存搜索框中键入的内容,如果用户决定再次打开面板,应用程序将再次搜索列表。目前,我只有一个名为test的项目,如您所见,我的问题是如果我在搜索框中键入了不可用的内容,并且我切换了面板,这是我的结果:

预期结果应该是错误消息,但搜索框、按钮和JList仍然可用,JList显示“未列出武器”

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

我想知道为什么当错误信息出现时,面板没有绘制

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;
}

JOptionPane的对话框是模态的,因此它们在对话框关闭之前停止执行调用代码。因此,在显示消息对话框之前,您需要先填充并显示列表,并将“未列出武器”作为其内容。

JOptionPane的对话框是模态的,因此它们在对话框关闭之前停止执行调用代码。因此,在显示消息对话框之前,您需要先填充并显示列表,并将“未列出武器”作为其内容。

看起来您正在将组件添加到一个容器中。至少,您需要
validate()
封闭容器,如图所示,并可能调用
repaint()
。更好的方法是将视图组件(例如
JList
)添加到布局中,并根据需要更新其模型(例如
ListModel
)。在这种情况下,一个
JList
将侦听附近表的模型。

看起来您正在将组件添加到容器中。至少,您需要
validate()
封闭容器,如图所示,并可能调用
repaint()
。更好的方法是将视图组件(例如
JList
)添加到布局中,并根据需要更新其模型(例如
ListModel
)。在这种情况下,一个
JList
会监听附近桌子的模型。

一旦对话框关闭,我仍然不会绘制面板的组件,但是println都会打印在控制台上search=new Object[]{“未列出武器”};它没有用新的“搜索”数组内容填充列表模型。@BinaryDigit09:正如建议的那样,模式对话框只会阻止用户交互;它不会阻止更新。@垃圾神:模态对话框会阻止显示它们的代码的执行。OP显示模式对话框,然后更新“搜索”数组,直到对话框关闭后才执行。@BinaryDigit09:发布到
事件队列的更新仍在处理中;尝试建议的实验以查看效果。一旦对话框关闭,我仍然无法绘制面板的组件,但是println都会打印在控制台上search=new Object[]{“未列出任何武器”};它没有用新的“搜索”数组内容填充列表模型。@BinaryDigit09:正如建议的那样,模式对话框只会阻止用户交互;它不会阻止更新。@垃圾神:模态对话框会阻止显示它们的代码的执行。OP显示模式对话框,然后更新“搜索”数组,直到对话框关闭后才执行。@BinaryDigit09:发布到
事件队列的更新仍在处理中;尝试建议的实验,看看效果如何。要想更快地获得更好的帮助,请张贴or。要更快地获得更好的帮助,请张贴or。