簡體   English   中英

實例化后為空的 TableModel

[英]empty TableModel after instantiating

新手求幫助:-)

我正在做一個小項目來熟悉 Java 桌面開發和數據庫連接。

附加代碼在實例化后給了我一個空的 TableModel,因此 JFrame 中沒有顯示數據。 測試 class 使用Test.showFrame(); .

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 獲取數據並將數據存儲在 a.

感謝幫助。

In its most basic form a table model for a JTable defines the columns, the mapping of object to column and holds the data for the JTable to call upon. 如果我們采用您當前的表 model 並將其縮減以適應此基本要求,我們將得到以下結果。

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;
  }

}

請注意,我們沒有在 model 本身中定義任何數據。 我們定義的只是一些數據存儲和我們需要的單列的列名。

我添加了一個 add() 方法,允許您將數據添加到 model(您可能希望自己定義刪除等)。 當您從 model 添加或刪除數據時,您必須始終讓 JTable 通過調用 fireTableDataChanged() 知道數據已更改,以便表可以重繪自身。

要使用這個表 model 你需要做

CategoryTableModel model = new CategoryTableModel();

model.add(new Category());

JTable table = new JTable(model);

您可以將 model.add() 替換為循環遍歷數據並將其添加到 model 的循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM