【问题标题】:My Panel's components are not drawn if JOptionPane is drawn如果绘制了 JOptionPane,则不绘制我的面板的组件
【发布时间】:2017-09-27 15:36:02
【问题描述】:

所以我有一个类,它在第一次单击武器按钮时创建以下 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;
}

【问题讨论】:

标签: java swing user-interface joptionpane


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 一旦对话关闭,我仍然没有绘制面板的组件,但是 println 都打印在控制台上
    • search = new Object[] {"未列出武器"};它没有使用新的“搜索”数组内容填充列表模型。
    • @BinaryDigit09:正如建议的那样,here 模态对话框只会阻止用户交互;它不会阻止更新。
    • @trashgod:模态对话框会阻止执行显示它们的代码。 OP 显示模态对话框,然后更新“搜索”数组,直到对话框关闭后才会执行。
    • @BinaryDigit09:发布到EventQueue 的更新仍在处理中;试试建议here的实验看看效果。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多