为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA jframe.remove(panel) 无法按预期工作

JAVA jframe.remove(panel) 无法按预期工作

慕斯709654 2022-08-03 15:33:51
我有一个带有两个面板的Jframe,我正在尝试使用jmenu项更改面板/视图。第一个面板将数据添加到数据库中。然后,用户可以通过单击 JMenuBarItem 切换到视图面板。第二个面板从数据库中提取数据,并在 JTable 中显示结果。一切正常,但当我来回切换到第二个面板时,它会添加另一个面板,而不是删除它/替换它。请参阅下面的链接图像以更好地了解第一个面板第二面板来回切换后的第二个面板
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

您犯的错误是每次打开视盘时都会创建一个新的 JTable。您不仅要创建一个新的,还要将其添加到您的视图 JPanel 中。这就是为什么你会得到奇怪的行为。


此代码段可解决您的问题。我刚刚将方法调用添加到 add-JPanel ActionListener 中。当 add-JPanel 打开时,旧的 JTable 将从 view-JPanel 中删除。我不得不注释掉你的数据库交互。removeAll()


    // ...

    // ...

    // ...

    add.addActionListener(new ActionListener()

    {

        public void actionPerformed(ActionEvent ae)

        {

            if (viewpanel.isShowing())

            {

                remove(viewpanel);

                /*

                 * I basically just added this one line.

                 * Since you want to make a fresh query after

                 * you come back to the viewpanel, we can delete

                 * all the elements (which is only the JTable).

                 */

                viewpanel.removeAll();

                add(addpanel);

            }


            revalidate();

            repaint();

        }

    });


    view.addActionListener(new ActionListener()

    {

        public void actionPerformed(ActionEvent ae)

        {

            java.util.List<String[]> datalist = new ArrayList<>();


            String[] columnNames = {"Emp ID", "Emp Name", "Department",

                    "Basic Pay", "House Allowance", "Payee", "NHIF", "NSSF",

                    "Pension", "NetPay"};

            try

            {

                //                    String query = "SELECT * FROM payroll";

                //                    Class.forName("com.mysql.jdbc.Driver");

                //                    Connection con = DriverManager.getConnection(host, username,

                //                            password);

                //                    Statement st = con.prepareStatement(query);

                //                    ResultSet rs = st.executeQuery(query);

                String[] results = {"a", "b", "c", "d", "e", "f", "g", "h",

                        "i", "j"};

                datalist.add(results);

                //                    con.close();

                String[][] data = new String[datalist.size()][];

                data = datalist.toArray(data);

                JTable table = new JTable(data, columnNames);


                JScrollPane sp = new JScrollPane(table);

                viewpanel.add(sp);


            }

            catch (Exception ex)

            {

                ex.printStackTrace();

            }

            if (addpanel.isShowing())

            {

                remove(addpanel);

                add(viewpanel);

            }

            else if (viewpanel.isShowing())

            {

                remove(viewpanel);

                add(viewpanel);

            }


            revalidate();

            repaint();

        }

    });

    // ...

    // ...

    // ...

当然,顶部的解决方案并不是唯一的解决方案。我不知道你想用这个UI去哪里,但是你可以删除表格的内容,并在再次打开view-JPanel后立即重新填充它们。


另一种解决方案是专门删除JTable(但在这种情况下,您可能需要将其作为字段,因为您可以在无法从-Block引用的块中创建表)add.addActionListener


第三种解决方案是添加一个布尔标志,检查表是否已加载,并且仅创建一个新的JTable(如果尚未加载)。



查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信