Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何在运行时创建多个jlists_Java_Mysql_Swing_Jlist - Fatal编程技术网

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

Java如何在运行时创建多个jlists,java,mysql,swing,jlist,Java,Mysql,Swing,Jlist,我需要创建一些名为“菜单”的选项卡窗格,在每个选项卡窗格中,我需要放置一个Jlist(产品),其中包含从mysql数据库中提取的一些其他数据。我创建了这个方法,但不幸的是,它只显示最后一个jlist,其他菜单选项卡窗格为空。为什么?谢谢 for (int i = 0; i < menuLista.size(); i++) { int menuId = menuLista.get(i).getMenuId(); jProductList = new J

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

    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
我对代码进行了如下修改:

    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);
            }
        });
    }
for(int i=0;i
但它仍然没有像我预期的那样工作

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

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对象


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

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

    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);
    }
for(int i=0;i
您的意思是:jScrollPane3.setViewportView(jTabbedPane1);超出循环的原则?我尝试了,但在线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中获得了一个异常:将容器的父级添加到容器本身我像您所说的那样尝试了,但再次无效,我将以下代码行放入:JScrollPane scrollPane=new JScrollPane(jProductList);jTabbedPane1.addTab(menuLista.get(i).getMenuName(),滚动窗格);在第一个for循环的末尾。也许在别的地方?谢谢