首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例化后TableModel为空

实例化后TableModel为空
EN

Stack Overflow用户
提问于 2020-04-29 16:05:58
回答 1查看 27关注 0票数 0

新手请寻求帮助:-)

我正在做一个小项目,以便熟悉Java桌面开发和数据库连接。

附加的代码在实例化后给我一个空的TableModel,因此没有数据显示在JFrame中。使用Test.showFrame();从主窗口的菜单实例化测试类。

代码语言:javascript
复制
package ...

import ...

public class Test extends JPanel {

    public Test() {
        initializePanel();
    }

    private void initializePanel() {

        // Creates an instance of TableModel
        CategoryTableModel tableModel = new CategoryTableModel();

        System.out.println(tableModel.getRowCount());
        // Creates an instance of JTable with a TableModel
        // as the constructor parameters.

        JTable table = new JTable(tableModel);
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);

        this.setPreferredSize(new Dimension(500, 200));
        this.setLayout(new BorderLayout());
        this.add(scrollPane, BorderLayout.CENTER);
    }

    public static void showFrame() {
        JPanel panel = new Test();
        panel.setOpaque(true);

        JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.pack();
        frame.setVisible(true);
    }

    class CategoryTableModel extends AbstractTableModel {

        private List<Category> all = null;
        private Iterator<Category> iterator = null;
        private int tableRowCount;
        private TableModel tableModel;


        public CategoryTableModel(){
            Vector tableData = new Vector();
            // TableModel's column names
            Vector<String> tableHeaders = new Vector<String>();
            tableHeaders.add("Category");

            // Database call
            all = new ReadCategory().allCategories();
            // TableModel's data
            for(Object o : all) {
                Vector<Object> row = new Vector<Object>();
                all.forEach((n) -> row.add(new Category().getName()));
                tableData.add(row);
                System.out.println("row added");

            }
            tableRowCount = tableData.size();
            tableModel = new DefaultTableModel(tableData, tableHeaders);
            System.out.println(tableModel.getRowCount());
        }

        @Override
        public int getRowCount() {
            return 0;
        }

        @Override
        public int getColumnCount() {
            return 0;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return null;
        }

    }

}

数据库调用通过Hibernate获取数据,并将数据存储在。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 22:17:52

在其最基本的形式中,JTable的表模型定义列、对象到列的映射,并保存供JTable调用的数据。如果我们采用您当前的表格模型,并将其削减以满足此基本需求,则会得到以下结果。

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class CategoryTableModel extends AbstractTableModel {

  private final List<Category> tableData = new ArrayList<>();

  public void add(Category cat) {
    tableData.add(cat);

    fireTableDataChanged();
  }

  @Override
  public String getColumnName(int column) {
    String result = "";

    if (column == 0) {
      result = "Category Name";
    }

    return result;
  }

  @Override
  public int getRowCount() {
    return tableData.size();
  }

  @Override
  public int getColumnCount() {
    return 1;
  }

  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
    if (columnIndex == 0) {
      return tableData.get(rowIndex).getName();
    }

    return null;
  }

}

请注意,我们没有在模型本身中定义任何数据。我们所定义的就是为数据和我们需要的单个列的列名定义一些存储空间。

我已经添加了一个add()方法,它允许您向模型中添加数据(您可能希望自己定义remove等)。在向模型添加数据或从模型中删除数据时,必须始终通过调用fireTableDataChanged()让JTable知道数据已经更改,以便表可以重新绘制自身。

要使用此表格模型,您需要执行以下操作

代码语言:javascript
复制
CategoryTableModel model = new CategoryTableModel();

model.add(new Category());

JTable table = new JTable(model);

可以用循环替换model.add(),该循环遍历数据并将其添加到模型中。

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

https://stackoverflow.com/questions/61496997

复制
相关文章

相似问题

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