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

标签 java swing jtable

问题是应用程序的 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() 来添加表,但我不确定这是否是正确的方法。即使我添加了表格,再次按下按钮时也无法将其删除。

最佳答案

您的代码中当前似乎缺少一些内容,导致表无法更新。如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);

关于java - 如果 GUI 是在构造函数中定义的,如何添加或删除 jtable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225399/

相关文章:

java - 向导不重绘/重新验证 jframe

java - 滚动到 JTable 中最后添加的行

JTable char[]、字符串和对象消耗 Java 堆空间

java - 如何写入 Netbeans 调试器控制台(使用 Java)?

java - 多态性(显着)比直接实现慢吗?

Java Swing 循环运行多个模拟

java - 将文件中的文本读取到 JTextField 数组中

java - 将一个 JTable 替换为其他(导入)Java

java - 使用Math.random()生成非重复数

java - 字符串的排序列表?不使用长度函数查找列表的长度