Не удается расширить JComboBox в JTable TableHeader

Я прочитал большинство ответов JTable/JComboBox на другие вопросы этого рода, но пока не нашел решения моей проблемы.

Я создал таблицу с элементами JComboBox TableHeader. Ни один из элементов JComboBox не откроется для отображения списка элементов. Как получить списки элементов для отображения отдельных элементов JComboBox?

Обратите внимание, что отличительным элементом этого вопроса является то, что JComboBox находится в TableHeader, а не встроен в ячейку JTable.

Любая помощь приветствуется.

ВПЧЭ

import java.awt.Component;
import java.awt.Dimension;
import java.util.Enumeration;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class ComboHeaderTest extends JScrollPane {

private static final Dimension DEFAULT_SIZE = new Dimension(200, 200);

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new ComboHeaderTest().initComponents();
        }
    });
}

private ComboHeaderTest() {

    final String[][] data = { {"Header 1", "Header 2", "Header 3"},
                                {"A", "B", "C"},
                                {"D", "E", "F"},
                                {"G", "H", "I"}};

    setViewportView(getTable(data));
    setPreferredSize(DEFAULT_SIZE);
}

private void initComponents() {

    JFrame frame = new JFrame("ComboHeaderTest");
    frame.add(this);
    frame.pack();
    frame.setVisible(true);
}

private JTable getTable(final String[][] data) {
    final String[] items = data[0];

    final ComboHeaderRenderer[] columnHeaders = new ComboHeaderRenderer[items.length];
    for(int i = 0; items.length > i; ++i) {
        columnHeaders[i] = new ComboHeaderRenderer(items);
    }

    final JTable table = new JTable(data, columnHeaders);

    final Enumeration<TableColumn> tableEnum = table.getColumnModel().getColumns();
    for (int columnIndex = 0; tableEnum.hasMoreElements(); ++columnIndex) {
        final TableColumn column = tableEnum.nextElement();

        final ComboHeaderRenderer combo = columnHeaders[columnIndex];
        column.setHeaderValue(combo.getItemAt(columnIndex));
        column.setHeaderRenderer(combo);
    }

    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.setRowSelectionAllowed(true);
    table.setColumnSelectionAllowed(false);
    table.setCellSelectionEnabled(false);
    table.setFillsViewportHeight(true);

    table.setSize(DEFAULT_SIZE);
    table.validate();

    return table;
}

private static class ComboHeaderRenderer extends JComboBox implements TableCellRenderer{
    public ComboHeaderRenderer(final String[] entries) {
        for (int i = 0; entries.length > i; ++i) {
            addItem(entries[i]);
        }
    }

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

2 ответа

Решение

Это на самом деле работает именно так, как и ожидалось. Я думаю, что ключ TableCellRenderer,

Рендерер, как правило, неинтерактивные компоненты. Обычно они представляют собой "мгновенный снимок" компонента, нанесенного на поверхность, и пользователь обычно не может взаимодействовать с ними.

Это ожидаемое поведение.

Чтобы предоставить редактируемую функциональность заголовку таблицы, вам нужно будет предоставить свою реализацию JTableHeader

Посмотрите на этот пример для некоторых идей

Вот пример, который использует JComboBox в JTable TableHeader.

Для других типов компонентов проще, посмотрите здесь.

введите описание изображения здесь

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