Jtable с различными типами ячеек в зависимости от типа данных
Как я могу реализовать JTable с различными типами редакторов ячеек, в зависимости от типа ввода, отображаемого конкретной строкой?
Например
- некоторые строки могут быть флажками (для логических типов)
- некоторые строки могут быть выпадающими списками (если я хочу предоставить фиксированный набор опций на выбор)
- некоторые строки могут быть текстовыми полями (если я позволю произвольные данные).
В настоящее время я реализовал AbstractTableModel
, который берет набор пользовательских полей из моего объекта и добавляет строки в таблицу. Я хотел бы дополнительно настроить мою таблицу, устанавливая определенные типы ячеек. Я могу определить, какой тип ячейки использовать, основываясь на типе поля, содержащегося в этой строке.
Модель таблицы динамически создается во время выполнения.
2 ответа
- некоторые строки могут быть флажками (для логических типов)
- некоторые строки могут быть выпадающими списками (если я хочу предоставить фиксированный набор опций на выбор)
- некоторые строки могут быть текстовыми полями (если я позволю произвольные данные).
например
import java.awt.EventQueue;
import java.util.Date;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class EachRowRendererEditor {
private JFrame frame = new JFrame("EachRowRendererEditor");
private String[] columnNames = {"Type", "Value"};
private Object[][] data = {
{"String", "I'm a string"},
{"Date", new Date()},
{"Integer", new Integer(123)},
{"Double", new Double(123.45)},
{"Boolean", Boolean.TRUE}};
private JScrollPane scrollPane;
private JTable table;
public EachRowRendererEditor() {
table = new JTable(data, columnNames) {
private static final long serialVersionUID = 1L;
private Class editingClass;
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
editingClass = null;
int modelColumn = convertColumnIndexToModel(column);
if (modelColumn == 1) {
Class rowClass = getModel().getValueAt(row, modelColumn).getClass();
return getDefaultRenderer(rowClass);
} else {
return super.getCellRenderer(row, column);
}
}
@Override
public TableCellEditor getCellEditor(int row, int column) {
editingClass = null;
int modelColumn = convertColumnIndexToModel(column);
if (modelColumn == 1) {
editingClass = getModel().getValueAt(row, modelColumn).getClass();
return getDefaultEditor(editingClass);
} else {
return super.getCellEditor(row, column);
}
}
// This method is also invoked by the editor when the value in the editor
// component is saved in the TableModel. The class was saved when the
// editor was invoked so the proper class can be created.
@Override
public Class getColumnClass(int column) {
return editingClass != null ? editingClass : super.getColumnClass(column);
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
scrollPane = new JScrollPane(table);
frame.add(scrollPane);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
EachRowRendererEditor eeee = new EachRowRendererEditor();
}
});
}
}
Создайте пользовательский класс, реализующий javax.swing.table.TableCellRenderer, который отображает значения, используя элемент управления, который вы хотите отобразить в зависимости от типа данных. Использовать экземпляры этого класса в качестве средства визуализации ячеек (TableColumn.setCellRenderer)