Не удается расширить 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;
    }
}
}
 mre26 февр. 2013 г., 21:57
+1 за включение SSCCE без предварительного запроса.
 kleopatra27 февр. 2013 г., 09:23
не связано: а)не используйте setXXSize б) не расширяйте JSomething, если вы можете достичь той же цели, используя его в) setSize не имеет никакого эффекта, или вы делаете что-то в корне неправильно (не используя LayoutManager)
 Todd27 февр. 2013 г., 20:51
@kleopatra - я предпочитаю композицию, а не наследование. Я использовал это в качестве тестового стенда, чтобы выяснить, что мешало раскрытию JComboBox, поэтому LayoutManager не было. Просто пытаюсь сохранить Простое в SSCCE.

Ответы на вопрос(2)

Решение Вопроса

как и ожидалось. Я думаю, что ключTableCellRenderer.

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

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

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

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

 trashgod27 февр. 2013 г., 03:35
Смотрите также этоВопрос &.
 Todd27 февр. 2013 г., 20:47
@trashgod - я смотрел на этот элемент перед публикацией, но я интерпретировал его, чтобы обеспечить решение, основанное на ячейках таблицы, а не на заголовке, хотя исходная тема была о заголовке. Теперь я вижу, что я был не прав. Благодарю.
 trashgod27 февр. 2013 г., 20:55
Да, я похоронилLede, :-)
 Todd27 февр. 2013 г., 20:43
@MadProgrammer - спасибо за разъяснение этого для меня. Я думал, что рендер будет отображать полностью функциональный компонент, а не только его визуальные аспекты.

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

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

Ваш ответ на вопрос