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)

Другие вопросы по тегам