我正在为数字走廊设置模式,以便管理员可以访问学生姓名和学生 ID。我的代码应该有一个包含学生姓名和 ID 的 JTable,当您按“添加行”按钮时,它会通过删除它、创建一个新的 Object[][],然后将其重新分配到 JTable 来向 JTable 添加一个空白行添加之前。但无论我按下按钮多少次,我的 JTable 都不会改变,而不是得到一个新的空白行
我尝试创建一个静态方法来创建一个Object[][]来重新分配JTable,但是Object[][]中的新行尚未反映在JTable中。
这是我的代码
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JScrollPane;
public class studentDataBase extends GoldenGate {
private static Object[][] buddy = t.getDb();
private static JTable ourTable;
studentDataBase() {
JFrame window = new JFrame();
Object[] columns = {"Names", "IDs"};
ourTable = new JTable(buddy, columns);
JLabel isThis = new JLabel("Is this working?");
JButton addRow = new JButton("Add New Student");
addRow.setBounds(400, 450, 200, 20);
addRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
window.remove(ourTable);
buddy = addNewRow(ourTable);
ourTable = new JTable(buddy, columns);
window.add(ourTable);
}
});
window.add(addRow);
window.setSize(720, 700);
isThis.setBounds(400, 200, 200, 30);
ourTable.setBounds(400, 400, 300, 300);
window.add(ourTable);
window.add(isThis);
window.add(new JScrollPane(ourTable));
window.pack();
window.setLayout(null);
window.setVisible(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static Object[][] addNewRow(JTable tab) {
Object[][] update = new Object[tab.getModel().getRowCount()+1][tab.getModel().getColumnCount()];
for(int r = 0; r < tab.getModel().getRowCount(); r++)
{
for(int c = 0; c < tab.getModel().getColumnCount(); c++) {
update[r][c] = tab.getModel().getValueAt(r, c);
}
}
return update;
}
}
JTable 与大多数 Swing 组件一样,只是来自单独数据源(称为模型)的数据视图。 JTable 的数据来自其TableModel。要添加行,您不应该创建一个全新的 JTable;只需更改模型,JTable 就会注意到该修改并相应地更新其自己的显示。
TableModel 文档页面的顶部包含以下内容:
所有已知的实现类:
您应该创建一个 DefaultTableModel(仅一次!),并使用其 addRow 方法。 (高级 Swing 开发人员应该扩展 AbstractTableModel,但这超出了本文的范围。)
另外,永远不要这样做
setLayout(null)
。它会破坏您的表格和滚动窗格的行为。组件的大小很复杂,因为文本的大小很复杂:“12 点”字体是一种文本行占 12⁄72 英寸的字体。执行此操作所需的确切像素数取决于所使用的显示器和所使用的图形模式。所有这些复杂的计算都已由 Swing 组件完成,标准布局管理器将适当地适应这些计算的大小。 JFrame 的默认布局是BorderLayout,因此您无需执行任何操作即可使用标准布局管理器;它已经在那里了。
因为布局管理器处理组件的放置和大小调整,所以一旦删除 setBounds
,您就可以删除对 setLayout(null)
的all
调用。因此,通过 DefaultTableModel 和正确的布局管理器使用,您的类可能如下所示:
public class studentDataBase extends GoldenGate {
private final DefaultTableModel buddy;
private final JTable ourTable;
studentDataBase() {
Object[] columns = {"Names", "IDs"};
buddy = new DefaultTableModel(t.getDb(), columns);
ourTable = new JTable(buddy);
JLabel isThis = new JLabel("Is this working?");
JButton addRow = new JButton("Add New Student");
addRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
buddy.addRow(new Object[columns.length]);
}
});
Box addRowContainer = Box.createHorizontalBox();
addRowContainer.add(addRow);
JFrame window = new JFrame();
window.add(addRowContainer, BorderLayout.SOUTH);
window.add(isThis, BorderLayout.NORTH);
window.add(new JScrollPane(ourTable), BorderLayout.CENTER);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationByPlatform(true);
window.setVisible(true);
}
}