问题是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()来添加表格,但我不确定它是否正确。即使我已经添加了一个表格,当再次按下该按钮时我也无法将其删除。
答案 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);