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(