设置 JTable 中列的数据类型

问题描述 投票:0回答:3

我创建了一个带有表模型的 JTable 。现在,根据我所拥有的输入,我想将一列设置为特定的数据类型。我该怎么做?

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;

public class MyTableModelTwo extends AbstractTableModel {

    private static final long serialVersionUID = 1L;
    private Object[][] data;
    private String[] columnNames;

    public MyTableModelTwo(Object[][] data) {
        this.data = data;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return data[rowIndex][columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    @Override
    public boolean isCellEditable(int rowIndes, int columnIndex) {
        return true;
    }

    @Override
    public String getColumnName(int index) {
        return columnNames[index];
    }

    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        data[rowIndex][columnIndex] = value;
        fireTableCellUpdated(rowIndex, columnIndex);
    }

    public MyTableModelTwo(String[] columnNames, Object[][] data) {
        this.columnNames = columnNames;
        this.data = data;
    }
}

class MyTableTwo extends JPanel implements TableModelListener {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private Object[][] data;
    private JTextField t;

    public MyTableTwo(int noElements, String[] columnNames) {
        data = new Object[noElements][columnNames.length];
        t = new JTextField();
        MyTableModelTwo m = new MyTableModelTwo(columnNames, data);
        table = new JTable(m);
        table.getModel().addTableModelListener(this);
        setLayout(new GridLayout(1, 0));
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }

    @Override
    public void tableChanged(TableModelEvent e) {
    }

    public JTextField returnT6() {
        return t;
    }
}
java swing jtable
3个回答
3
投票

覆盖 public Class getColumnClass(int column) {...

请问我的问题,为什么你需要 AbstractModel,出于为什么原因,你真正想要限制/修改/更改/覆盖什么,(

you can prety ignore this == be sure that not really not good way to start to playing with anything for JTable based on AbstractTableModel
),但是......考虑使用 DefalutTableModel 而不是 AbstractTableModel


0
投票

注意: 列确实有数据类型。添加至少 1 行后运行此操作。

System.out.println("Column Types : "    + table.getColumnClass(0) + "  "                                                                                + table.getColumnClass(1) + "  "                                                         + table.getColumnClass(2)  );

使用排序时,列类很重要: table.setAutoCreateRowSorter(true);

如果列类是字符串,但包含数字,则它们按字母顺序而不是数字顺序排序。 如果您将混合数据类型放入列中(例如字符串和整数)并尝试排序,排序会失败并且您会收到很多错误消息。


-2
投票

我的观点是正确的,但我不相信 JTable 中的列(或单元格)有任何数据类型的概念。您最好检查预期的整数,否则抛出异常。例如:

try{
  Integer.parseInt(myTableCellValue);
}catch(ParseException e){
  //Not a valid integer
}
© www.soinside.com 2019 - 2024. All rights reserved.