问题是应用程序的 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/