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

时间:2016-10-24 18:47:14

标签: java swing jtable

问题是app的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类无法访问构造函数中的面板。我已经使用add()来添加表格,但我不确定它是否正确。即使我已经添加了一个表格,当再次按下该按钮时我也无法将其删除。

1 个答案:

答案 0 :(得分:1)

您的代码中似乎缺少一些可以防止表更新的内容。正如camickr已经指出的那样,没有必要替换表组件(甚至是表模型)。如果更新模型,表应自动检测更改并刷新。此外,该表当前已创建,但未添加到框架中。

使用显式表模型创建表并将其添加到框架中可以这样做:

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类(例如作为其构造函数的参数)并更新模型,如下所示:

tableModel.setDataVector(data, columnNames);