首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示JTable

显示JTable
EN

Stack Overflow用户
提问于 2015-04-13 03:47:10
回答 1查看 195关注 0票数 0

我尝试显示单个JTable,但每次插入新产品时都会收到许多新的JTables:http://i.stack.imgur.com/gyNsn.png

如何在只显示一个JTable的同时使列名可见?

下面是创建该表的方法:

代码语言:javascript
复制
 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类的一部分:

代码语言:javascript
复制
 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);
});
EN

回答 1

Stack Overflow用户

发布于 2015-04-13 04:15:41

您发布的populate方法每次被调用时都会创建一个新的JTable。由于每次调用ActionListener时都会调用此方法,因此将添加一个新的JTable。您应该考虑创建自己的TableModel扩展AbstractTableModel,并覆盖必要的方法,为每一行/列返回适当的值。下面是一个简单的例子,出于演示的目的,对项目结构做了一些假设(例如,仓库是一个列表的实例):

代码语言:javascript
复制
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的监听器

代码语言:javascript
复制
MyTableModel tableModel = new MyTableModel();
myTable.setMOdel(tableModel);
.......
//when an item is added to 
warehouse.add(item);
tableModel.fireTableDataChanged();

有关如何在Oracle Tutorials中自定义JTable的更多演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29593872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档