Java JTable 自定义单元格

介绍

Java中的JTable是一种常见的表格控件,用于显示和编辑数据。JTable提供了很多自定义的功能,其中之一就是自定义单元格。通过自定义单元格,我们可以改变单元格的外观和行为,以满足特定需求。

本文将介绍如何使用Java JTable来自定义单元格,包括如何自定义单元格的外观、编辑功能、以及如何处理特定的事件。我们将通过一个简单的例子来演示这些功能。

示例

假设我们有一个学生信息表,其中包含学生的姓名、性别、年龄和成绩。我们希望在JTable中显示这些信息,并为成绩一列添加一个自定义的进度条,以便更直观地显示学生的成绩。

首先,我们需要创建一个TableModel来存储学生信息。以下是一个简单的例子:

public class StudentTableModel extends AbstractTableModel {
    private List<Student> students;

    public StudentTableModel(List<Student> students) {
        this.students = students;
    }

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

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Student student = students.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return student.getName();
            case 1:
                return student.getGender();
            case 2:
                return student.getAge();
            case 3:
                return student.getScore();
            default:
                return null;
        }
    }

    @Override
    public String getColumnName(int column) {
        switch (column) {
            case 0:
                return "姓名";
            case 1:
                return "性别";
            case 2:
                return "年龄";
            case 3:
                return "成绩";
            default:
                return null;
        }
    }
}

这个TableModel继承自AbstractTableModel,并实现了必要的方法。在getValueAt方法中,我们根据行和列的索引返回相应的值。在getColumnName方法中,我们返回每一列的名称。

接下来,我们需要创建一个自定义的单元格渲染器来显示进度条。以下是一个简单的例子:

public class ScoreCellRenderer extends JProgressBar implements TableCellRenderer {

    public ScoreCellRenderer() {
        setMinimum(0);
        setMaximum(100);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setValue((int) value);
        return this;
    }
}

这个渲染器继承自JProgressBar,并实现了TableCellRenderer接口。在getTableCellRendererComponent方法中,我们将单元格的值设置为进度条的值,并返回渲染器本身。

接下来,我们需要创建一个自定义的单元格编辑器,以便能够对成绩进行编辑。以下是一个简单的例子:

public class ScoreCellEditor extends AbstractCellEditor implements TableCellEditor {

    private JProgressBar progressBar;

    public ScoreCellEditor() {
        progressBar = new JProgressBar();
        progressBar.setMinimum(0);
        progressBar.setMaximum(100);
        progressBar.setBorder(BorderFactory.createEmptyBorder());
        progressBar.setFocusable(false);
    }

    @Override
    public Object getCellEditorValue() {
        return progressBar.getValue();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        progressBar.setValue((int) value);
        return progressBar;
    }
}

这个编辑器继承自AbstractCellEditor,并实现了TableCellEditor接口。在getCellEditorValue方法中,我们返回编辑器的值。在getTableCellEditorComponent方法中,我们将单元格的值设置为编辑器的值,并返回编辑器本身。

现在,我们可以使用这些自定义的类来创建我们的JTable了。以下是一个简单的例子:

public class CustomizedJTableExample {

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("张三", "男", 18, 80));
        students.add(new Student("李四", "女", 19, 90));
        students.add(new Student("王五", "男", 20, 70));

        StudentTableModel model = new StudentTableModel(students);
        JTable table = new JTable(model);
        table.getColumnModel().getColumn(