Java如何在运行时创建几个jlists

时间:2014-05-22 16:40:48

标签: java mysql swing jlist

我需要创建一个名为“menu”的tabbedpane,并且在每个tabbedpane中我需要将一个Jlist(产品)与从mysql db中提取的其他一些数据放在一起。我创建了这个方法但不幸的是它只显示了最后一个jlist,其他菜单tabbedpane是空的。为什么?感谢。

    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); 在那段代码之后,它只打印出最后的产品。 所以,这不是可视化问题。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

我猜您应该将选项卡式窗格添加到滚动窗格的视口中。在创建所有选项卡之后,应将选项卡式窗格添加到循环外部的视口中。

编辑:

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

然而,我很接近(我想?)。我相信问题现在出现在这一行:

pL.add(jScrollPane3);

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

您需要为每个标签创建一个新的滚动窗格。我会使用如下代码:

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

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

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

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

答案 1 :(得分:0)

好的,我已经解决了。这是工作代码:

    for (int i = 0; i < menuLista.size(); i++) {
        int menuId = menuLista.get(i).getMenuId();
        DefaultListModel modelProductList = new DefaultListModel();
        JList jProductList = new JList(modelProductList);
        prodottiLista = DBManager.fillProductList(menuId);
        for (int b = 0; b < prodottiLista.size(); b++) {
            modelProductList.addElement((Product) prodottiLista.get(b));
        }
        JScrollPane scrollPane = new JScrollPane(jProductList);
        jTabbedPane1.addTab(menuLista.get(i).getMenuName(), scrollPane);
        jProductList.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jProductListValueChanged(evt);
            }
        });
        jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jProductList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    }