java - 显示 JTable

标签 java swing user-interface tree jtable

我正在尝试显示单个 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/

相关文章:

java - 无法定位按钮或 JLabel

JavaFX - 音乐开/关切换按钮(不起作用)

java - 如何使用PagerSlidingTabStrip android在viewpager选项卡上显示收到消息的计数?

java - 无法避免覆盖文本文件上的所有内容

java - 当我在 Java 中使用 GridBagLayout 时,按钮没有填充所有可用空间

java - Swing 撤消选项

java - JavaFX 中带有滑动行标题的表格控件

java - 检查 Cassandra 是否正常工作

Java:将箭头放置在 Jung2 Network 中边缘的中心

c# - 拒绝基于对象数据的拖放?