为自定义 AbstractTableModel 中的所有列设置对齐方式

Set alignment for all columns in custom AbstractTableModel

我有一个自定义的 AbstractTableModel,我想默认将所有列居中。 我知道这是使用 TableCellRenderer 制作的,但我不知道如何在我的代码中实现它。 这是我的 class.

import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;

public class BiseccionModel extends AbstractTableModel {

    private String[] columnNames = {
            "i",
            "a",
            "b",
            "xi",
            "error",
            "f(a)",
            "f(xi)"
    };

    private ArrayList<Biseccion> values;

    public BiseccionModel() {
        values = new ArrayList<Biseccion>();
    }

    public BiseccionModel(ArrayList<Biseccion> values) {
        this.values = values;
    }

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

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Biseccion biseccion = getBiseccion(rowIndex);

        switch (columnIndex) {
            case 0 -> {
                return biseccion.getI();
            }
            case 1 -> {
                return biseccion.getA();
            }
            case 2 -> {
                return biseccion.getB();
            }
            case 3 -> {
                return biseccion.getXi();
            }
            case 4 -> {
                return biseccion.getError();
            }
            case 5 -> {
                return biseccion.getFa();
            }
            case 6 -> {
                return biseccion.getFxi();
            }
            default -> {
                return null;
            }
        }
    }

    @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
        Biseccion biseccion = getBiseccion(rowIndex);

        switch (columnIndex) {
            case 0 -> biseccion.setI((Integer) value);
            case 1 -> biseccion.setA((Double) value);
            case 2 -> biseccion.setB((Double) value);
            case 3 -> biseccion.setXi((Double) value);
            case 4 -> biseccion.setError((Double) value);
            case 5 -> biseccion.setFa((Double) value);
            case 6 -> biseccion.setFxi((Double) value);
        }

        fireTableCellUpdated(rowIndex, columnIndex);

    }

    public Biseccion getBiseccion(int row) {
        return values.get(row);
    }
}

这可能/一个好主意还是我应该坚持在 class 中使用 JTables 和自定义模型?

TableModel 不进行渲染。但是,您确实需要通过实施 getColumnClass(...) 方法来定义每列的数据类型,如上一个问题所示,因此 table 可以为给定的 [=19= 选择合适的渲染器].

Double 和 Integer 的默认渲染器将右对齐显示数字。

如果您确实希望它们居中,则可以使用 JTable.getDefaultRenderer(...) 方法获取默认渲染器。默认渲染器是 JLabel,因此您可以设置其对齐方式:

DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getDefaultRenderer(Double.class);
renderer.setHorizontalAlignment(JLabel.CENTER);