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

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

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

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

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

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

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

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

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

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

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

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