如果在构造函数中定义了 GUI,如何添加或删除 jtable?

How to add or remove a jtable if the GUI is defined in a constructor?

问题是应用程序的 GUI 是在构造函数中定义的,我无法访问面板或框架来添加或删除 jtable。这是构造函数代码:

public FirstSwingApp(){

    super();
    jbtOK = new JButton("OK");
    jbtOK.addActionListener(new BtnPress());

    jbtAdd = new JButton("Add");
    jbtAdd.addActionListener(new BtnAdd());

    jbtView = new JButton("View Table");
    jbtView.addActionListener(new BtnView());

    lblName = new JLabel("Friend Name");
    nameText = new JTextField(20);

    lblNo = new JLabel("Friend Number");
    noText = new JTextField(4);

    lblBdate = new JLabel("Birth date");
    bdateText = new JTextField(10);

    lblSex = new JLabel("Sex");
    sexText = new JTextField(1);

    lblState = new JLabel("State");
    stateText = new JTextField(20);

    lblCity = new JLabel("City");
    cityText = new JTextField(20);

    panelBtn = new JButton("pbutton");

    table = new JTable();


    JPanel panel1 = new JPanel();
    panel1.setLayout(new FlowLayout(FlowLayout.LEADING));
    panel1.setSize(300,300);
    panel1.add(lblName);
    panel1.add(nameText);
    panel1.add(lblNo);
    panel1.add(noText);


    JPanel panel2 = new JPanel();
    panel2.setLayout(new FlowLayout(FlowLayout.LEADING));
    panel2.setSize(300,300);
    panel2.add(lblBdate);
    panel2.add(bdateText);
    panel2.add(lblSex);
    panel2.add(sexText);

    JPanel panel3 = new JPanel();
    panel3.setLayout(new FlowLayout(FlowLayout.LEADING));
    panel3.setSize(300,300);
    panel3.add(lblState);
    panel3.add(stateText);
    panel3.add(lblCity);
    panel3.add(cityText);


    JPanel panel4 = new JPanel();
    panel4.setLayout(new FlowLayout(FlowLayout.LEADING));
    panel4.setSize(300,300);
    panel4.add(jbtAdd);

    JPanel panel5 = new JPanel();
    panel5.setLayout(new FlowLayout(FlowLayout.LEADING));
    panel5.setSize(300,300);

    panel5.add(jbtView);



    this.add(panel1);
    this.add(panel2);
    this.add(panel3);
    this.add(panel4);
    this.add(panel5);




    this.setLayout(new FlowLayout(FlowLayout.LEADING));

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    this.setBounds(100,100,400,250);

    this.setTitle("gotta get that swing");

    this.setVisible(true);

    this.setSize(700,400);


}

这是 ActionListener 代码:

private class BtnView implements ActionListener{

    public void actionPerformed(ActionEvent e) {

        CallableStatement dstmt = null;
        ResultSet rs;

        try {

            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Contact_Manager?user=root");
            String disQuery = "select * from FRIEND";

            dstmt = conn.prepareCall(disQuery);

            rs = dstmt.executeQuery();

            ResultSetMetaData metaData = rs.getMetaData();

            // names of columns
            Vector<String> columnNames = new Vector<String>();
            int columnCount = metaData.getColumnCount();
            for (int column = 1; column <= columnCount; column++) {
                columnNames.add(metaData.getColumnName(column));
            }

            // data of the table
            Vector<Vector<Object>> data = new Vector<Vector<Object>>();
            while (rs.next()) {
                Vector<Object> vector = new Vector<Object>();
                for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                    vector.add(rs.getObject(columnIndex));
                }
                data.add(vector);
            }

            // It creates and displays the table

            table = new JTable(data, columnNames);

            add(new JScrollPane(table));

            repaint();
            revalidate();


        } catch (SQLException ex) {

            System.out.println("Error in connection: " + ex.getMessage());
        }

    }
}

按钮的actionListener class 无法访问构造函数中的面板。我已经使用 add() 来添加 table 但我不确定它是否是正确的方法。即使我添加了 table,再次按下按钮时也无法将其删除。

看起来您的代码中目前缺少一些东西,这会阻止 table 更新。正如 camickr 已经指出的那样,没有必要更换 table 组件(甚至 table 模型)。如果更新模型,table 应该会自动检测更改并刷新。此外,table 当前已创建,但未添加到框架中。

使用显式 table 模型创建 table 并将其添加到框架中可以像这样完成:

DefaultTableModel tableModel = new DefaultTableModel();

JTable table = new JTable(tableModel);

JPanel panel6 = new JPanel();
panel6.setLayout(new FlowLayout(FlowLayout.LEADING));
panel6.setSize(300,300);
panel6.add(new JScrollPane(table));

this.add(panel6);

您可以将 tableModel 传递给 BtnView class(例如作为其构造函数的参数)并像这样更新模型:

tableModel.setDataVector(data, columnNames);