为自定义 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);
我有一个自定义的 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);