Java如何在运行时创建多个jlist

标签 java mysql swing jlist

我需要创建一些名为“菜单”的选项卡 Pane ,并且在每个选项卡 Pane 中我需要放置一个 Jlist(产品)以及从 mysql 数据库中提取的其他一些数据。我创建了这个方法,但不幸的是它只显示最后一个 jlist,其他菜单选项卡 Pane 是空的。为什么?谢谢。

    for (int i = 0; i < menuLista.size(); i++) {
        int menuId = menuLista.get(i).getMenuId();
        jProductList = new JList(modelProductList);
        prodottiLista.clear();
        modelProductList.clear(); 
        prodottiLista = DBManager.fillProductList(menuId);

        for (int b = 0; b < prodottiLista.size(); b++) {
            modelProductList.addElement((Product) prodottiLista.get(b));
        }

        jProductList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jProductList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jProductListValueChanged(evt);
            }
        });
        JPanel pL = new JPanel();
        pL.add(jScrollPane3);
        // panelList.add(pL);
        jTabbedPane1.addTab(menuLista.get(i).getMenuName(), pL);
        jScrollPane3.setViewportView(jProductList);
    }

我将代码修改如下:

    for (int i = 0; i < menuLista.size(); i++) {
        int menuId = menuLista.get(i).getMenuId();
        modelProductList.clear(); // ricarico la lista dei prodotti.
        prodottiLista = DBManager.fillProductList(menuId);

        for (int b = 0; b < prodottiLista.size(); b++) {
            modelProductList.addElement((Product) prodottiLista.get(b));
        }
        System.out.println(modelProductList);

        JScrollPane scrollPane = new JScrollPane(jProductList);
        jTabbedPane1.addTab(menuLista.get(i).getMenuName(), scrollPane);

        jProductList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jProductList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jProductListValueChanged(evt);
            }
        });
    }

但是它仍然没有按照我的预期工作。

再次编辑: 我注意到如果我放这一行: System.out.println(modelProductList); 在该代码块之后,它仅打印最后的产品。 所以,这不是可视化的问题。有什么建议吗?

最佳答案

jTabbedPane1.addTab(menuLista.get(i).getMenuName(), pL);
jScrollPane3.setViewportView(jProductList);

将最后创建的 JList 添加到滚动 Pane 的视口(viewport)中。视口(viewport)只能包含单个组件。

我猜您应该将选项卡式 Pane 添加到滚动 Pane 的视口(viewport)中。创建所有选项卡后,应将选项卡式 Pane 添加到循环外部的视口(viewport)中。

编辑:

抱歉,我误读了您的代码,我看到您正在将列表添加到滚动 Pane 到面板到选项卡式 Pane ,所以我的建议是错误的。

但是,我很接近(我认为?)。我相信现在问题出在这一行:

pL.add(jScrollPane3);

您只有一个滚动 Pane 实例,因此它只能显示在最后一个选项卡上。

您需要为每个选项卡创建一个新的滚动 Pane 。我会使用如下代码:

JScrollPane scrollPane = new JScrollPane( jProductList );
jTabbedPane1.addTab(menuLista.get(i).getMenuName(), scrollPane);

无需先将滚动 Pane 添加到面板中。现在,滚动 Pane 将随着选项卡式 Pane 大小的调整而调整大小。

此外,另一方面,您不应该在 for 循环中使用实例变量。相反,您应该只使用局部变量,因为这些变量的存在只是为了帮助您创建添加到选项卡式 Pane 中的 GUI 对象。

例如,jProductList、prodottiLista、modelProductList 都应该是局部变量,并且您需要为每个类创建一个新实例。您不能只是clear() 模型中的内容,因为每个 JList 不会引用同一模型,因此您添加到最后一个选项卡的数据将再次显示在所有选项卡上。

关于Java如何在运行时创建多个jlist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812681/

相关文章:

java - 将 GUI 添加到我的应用程序

java - JTextField 的透明度不起作用

java - 来自堆栈的Java中的假彩色图像

php - LEFT JOIN 只返回右表中的一行

php - 在 AJAX SUCCESS 上更改并保存 SPAN CSS,然后检索保存的信息

mysql - 什么是数据库上下文中的数据集?

java - Java 中不同类型的 Groovy 执行

java - JUnit 测试在 Eclipse 工作台中通过,但在 Ant 构建中失败

java - 欧洲版本的 Android 上的 NumberFormatException?

swing - JTextPane active