我正在尝试显示单个 JTable,但每次插入新产品时我都会收到许多新的 JTable:/image/gyNsn.png
如何只显示一个 JTable 并且使列名可见?
这是创建表的方法:
public JTable populate(Product p) {
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object> row = new Vector<Object>();
Vector<String> headers = new Vector<String>();
headers.add("Product name");
headers.add("Price");
headers.add("In stock");
row.add(p.getProductName());
row.add(p.getPrice());
row.add(p.getStock());
data.add(row);
productsTable = new JTable(data, headers);
return (new JTable(data, headers));
}
这是 GUI 类的一部分:
addProductBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Product product = new Product(insertProductName.getText(), Integer.parseInt(insertPrice.getText()), Integer.parseInt(insertStock.getText()));
warehouse.addProduct(product); // by using a TreeSet
productsTable = warehouse.populate(product); // here I call the earlier defined method
warehouse.initFile(); // I wrote the productsTable content into a binary file, so that it can act like a database
warehouse.readFile();
warehouse.populate(product);
manageProductsPanel.add(productsTable);
});
最佳答案
您发布的 populate 方法每次调用时都会创建一个新的 JTable。鉴于每次调用 ActionListener 时都会调用此函数,因此将添加一个新的 JTable。您应该考虑创建自己的 TableModel - 扩展 AbstractTableModel 并重写必要的方法,为每行/列返回适当的值。下面是一个简单的例子,为了演示而对项目结构做了一些假设(例如仓库是一个列表的实例):
public class MyTableModel extends AbstractTableModel{
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return warehouse.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
switch(arg1){
case 0:
return warehouse.get(arg0).getName();
case 1:
return warehouse.get(arg0).getPrice();
default:
return warehouse.get(arg0).isInStock();
}
}
@Override
public String getColumnName(int col){
switch(col){
case 0:
return "Name";
case 1:
return "Price";
default:
return "In STock";
}
}
}
然后您可以创建此类的实例,并设置 JTable 的表模型。每次更新支持的 List 时,您都可以更新 TableModel 的 Listeners
MyTableModel tableModel = new MyTableModel();
myTable.setMOdel(tableModel);
.......
//when an item is added to
warehouse.add(item);
tableModel.fireTableDataChanged();
Oracle Tutorials中有更多关于如何自定义JTable的演示
关于java - 显示 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29593872/