【问题标题】:HashMap in JTable [duplicate]JTable中的HashMap [重复]
【发布时间】:2016-11-13 17:29:59
【问题描述】:

我无法制作包含哈希图而不是多维数组的 JTable。我正在使用我自己的自定义表类并在构造函数上出错。这是该类的代码:

import javax.swing.table.DefaultTableModel;
import java.util.HashMap;

public class CustomTable extends DefaultTableModel {
    private String[] columnNames;
    private HashMap<Integer, Object[]> newData;

    public CustomTable(HashMap<Integer, Object[]> newData, String[] columnNames) {
        this.newData = newData;
        this.columnNames = columnNames;
    }

    public int getColumnCount() { return columnNames.length; }

    public int getRowCount() { return newData.size(); }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        Object[] rowData = newData.get(row);
        return rowData[col];
    }

    public void setValueAt(Object value, int row, int col) {
        Object[] rowData = newData.get(row);
        rowData[col] = value;

        fireTableCellUpdated(row, col);
    }

    public void removeRow(int row) {
        newData.remove(row);
        fireTableRowsDeleted(row, row);
    }
}

这是错误:

Exception in thread "main" java.lang.NullPointerException
    at CustomTable.getRowCount(CustomTable.java:21)
    at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:224)
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:124)
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:106)
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:86)
    at CustomTable.<init>(CustomTable.java:9)
    at ControlPanelUI.setupTable(ControlPanelUI.java:22)
    at ControlPanelUI.createRightCP(ControlPanelUI.java:106)
    at MovieStore.<init>(MovieStore.java:33)
    at MovieStore.main(MovieStore.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

【问题讨论】:

  • 错误是什么?
  • 分享错误信息!
  • (不是问题,而是:您removeRow 不会重新编号。您分配this.newData 两次。newData 字段可能应该是final。您可能希望将可变数据复制到构造函数(并检查null)。哦,检查键是否与行号匹配。)
  • 更新的帖子包含错误信息。 @jatDevta
  • 如果这不是重复的,请编辑您的问题以包含一个minimal reproducible example,它显示您基于此example 修改的方法。

标签: java swing hashmap jtable


【解决方案1】:

我的第一个建议是不要使用 HashMap。整数作为键然后数组作为数据有什么意义?密钥永远不会在模型中使用。只需使用ArrayList

其次,不要扩展DefaultTableModel。该类已经为所有方法的模型和实现提供了存储空间。不知道再次覆盖所有方法。相反,您应该扩展 AbstractTableModel

注意您的错误消息是指setDataVector(...) 方法?您收到此错误是因为您正在扩展 DefaultTableModel。如果您改为扩展 AbstractTableModel,问题应该会消失。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多