如果在构造函数中定义了 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);
问题是应用程序的 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);