我尝试显示单个JTable,但每次插入新产品时都会收到许多新的JTables:http://i.stack.imgur.com/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);
});发布于 2015-04-13 04:15:41
您发布的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设置表模型。每次更新支持列表时,都可以更新TableModel的监听器
MyTableModel tableModel = new MyTableModel();
myTable.setMOdel(tableModel);
.......
//when an item is added to
warehouse.add(item);
tableModel.fireTableDataChanged();有关如何在Oracle Tutorials中自定义JTable的更多演示
https://stackoverflow.com/questions/29593872
复制相似问题