JAVA jframe.remove (панель) не работает должным образом - PullRequest
1 голос
/ 10 марта 2019

У меня есть Jframe с двумя панелями, и я пытаюсь изменить панели / виды с помощью элементов jmenu.

Первая панель добавляет данные в базу данных. Затем пользователь может переключиться на панель просмотра, щелкнув JMenuBarItem.

Вторая панель извлекает данные из базы данных и отображает результаты в JTable.

Все работает нормально, но когда я переключаюсь на вторую панель, она добавляет другую панель вместо того, чтобы удалить или заменить ее. Смотрите связанные изображения ниже, чтобы лучше понять

Первая панель

First Panel

Вторая панель

Second Panel

Вторая панель после переключения назад и вперед

Second Panel after switching back and forth

package employeerecords3;

import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.*;


public class EmployeeRecords3 extends JFrame {

    JLabel empnolb, empnamelb, empdptlb, basicsallb, hseallowancelb;
    JTextField empnotf, empnametf, empdpttf, basicsaltf, hseallowancetf;
    JButton submitbtn, cancelbtn;
    String host = "jdbc:mysql://localhost:3306/employee";
    String username = "root";
    String password = "";

    EmployeeRecords3() {
        setTitle("Employee Records");

        final JPanel addpanel = new JPanel();
        final JPanel viewpanel = new JPanel();
        setTitle("Employee Records");

        JMenuBar menubar = new JMenuBar();
        setJMenuBar(menubar);
        JMenu file = new JMenu("File");
        menubar.add(file);
        JMenuItem add = new JMenuItem("Add Employee");
        JMenuItem view = new JMenuItem("View Employees");
        file.add(add);
        file.add(view);

        add.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (viewpanel.isShowing()) {
                    remove(viewpanel);
                    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);
                    while (rs.next()) {
                        String[] results = {rs.getString(1), rs.getString(2), rs.getString(3), Double.toString(rs.getDouble(4)), Double.toString(rs.getDouble(5)), Double.toString(rs.getDouble(6)), Double.toString(rs.getDouble(7)), Double.toString(rs.getDouble(8)), Double.toString(rs.getDouble(9)), Double.toString(rs.getDouble(10))};
                        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();
            }
        });

        empnolb = new JLabel("Emp No");
        empnamelb = new JLabel("Name");
        empdptlb = new JLabel("Department");
        basicsallb = new JLabel("Basic Pay");
        hseallowancelb = new JLabel("House Allowance");

        empnotf = new JTextField();
        empnametf = new JTextField();
        empdpttf = new JTextField();
        basicsaltf = new JTextField();
        hseallowancetf = new JTextField();

        submitbtn = new JButton("Submit");
        cancelbtn = new JButton("Cancel");

        Submit submithandler = new Submit();
        submitbtn.addActionListener(submithandler);

        Cancel cancelhandler = new Cancel();
        cancelbtn.addActionListener(cancelhandler);

        addpanel.add(empnolb);
        addpanel.add(empnotf);

        addpanel.add(empnamelb);
        addpanel.add(empnametf);

        addpanel.add(empdptlb);
        addpanel.add(empdpttf);

        addpanel.add(basicsallb);
        addpanel.add(basicsaltf);

        addpanel.add(hseallowancelb);
        addpanel.add(hseallowancetf);

        addpanel.add(submitbtn);
        addpanel.add(cancelbtn);

        addpanel.setLayout(new GridLayout(6, 2));
        viewpanel.setLayout(new GridLayout(1, 1));
        add(addpanel);
        setSize(300, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);

    }

    private class Submit implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String empNo, empName, department;
            double grossPay, basicPay, hseAllowance, payee, nhif, nssf, pension, netPay;

            empNo = empnotf.getText();
            empName = empnametf.getText();
            department = empdpttf.getText();
            basicPay = Double.parseDouble(basicsaltf.getText());
            hseAllowance = Double.parseDouble(hseallowancetf.getText());

            grossPay = basicPay + hseAllowance;
            payee = 0.3 * grossPay;
            if (grossPay > 100000) {
                nhif = 1200;
            } else {
                nhif = 320;
            }
            nssf = 200;
            pension = 0.05 * basicPay;
            netPay = grossPay - (payee - nhif - nssf - pension);

            String query = "INSERT INTO payroll(EmpID,EmpName,Department,BasicPay,HouseAllowance,Payee,NHIF,NSSF,Pension,NetPay) VALUES('" + empNo + "','" + empName + "','" + department + "','" + basicPay + "','" + hseAllowance + "','" + payee + "','" + nhif + "','" + nssf + "','" + pension + "','" + netPay + "')";

            try {

                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(host, username, password);
                Statement st = con.prepareStatement(query);

                int count = st.executeUpdate(query);
                boolean action = (count > 0);
                if (action) {
                    empnotf.setText(null);
                    empnametf.setText(null);
                    empdpttf.setText(null);
                    basicsaltf.setText(null);
                    hseallowancetf.setText(null);
                }

            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }
    }

    private class Cancel implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }

    public static void main(String[] args) {

        EmployeeRecords3 er = new EmployeeRecords3();
    }

}

1 Ответ

1 голос
/ 11 марта 2019

Ошибка, которую вы сделали, заключается в том, что вы создаете новую таблицу JTable каждый раз, когда открываете панель просмотра . Вы не только создаете новый, вы добавляете его в свой view-JPanel . Вот почему вы получаете странное поведение.

Этот фрагмент кода решает вашу проблему. Я только что добавил вызов метода removeAll() в add-JPanel ActionListener. Когда add-JPanel открывается, старая JTable удаляется из view-JPanel. Я должен был закомментировать ваши взаимодействия с базой данных.

    // ...
    // ...
    // ...
    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();
        }
    });
    // ...
    // ...
    // ...

Решение сверху не единственное, конечно. Я не знаю, куда вы хотите пойти с этим пользовательским интерфейсом, но вы можете просто удалить содержимое таблицы и снова заполнить их, как только вы снова откроете представление JPanel .

Другим решением было бы для конкретного удаления JTable (но в этом случае вам, вероятно, нужно иметь его как поле, потому что вы создаете таблицу в блоке, на который вы не можете ссылаться из вашего add.addActionListener -блок)

Третьим решением было бы добавить логический флаг , который проверяет, была ли таблица загружена, и создает новый JTable, только если у него нет .

...