JComboBox non riesce ad espandersi in JTable TableHeader

Ho letto la maggior parte delle risposte di JTable / JComboBox ad altre domande di questo tipo, ma non ho ancora trovato una soluzione al mio problema.

Ho creato una tabella con elementi TableHeader di JComboBox. Nessuno degli elementi di JComboBox si aprirà per visualizzare un elenco di elementi. Come posso visualizzare gli elenchi articoli per i singoli elementi di JComboBox?

Si noti che un elemento distintivo di questa domanda è che JComboBox si trova in TableHeader, non incorporato in una cella JTable.

Qualsiasi aiuto è apprezzato.

SSCE

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; } } } 

Questo in realtà funziona esattamente come previsto. Penso che l’indizio sia TableCellRenderer .

I renderer sono in genere componenti non interattivi. Di solito sono solo una “istantanea” del componente dipinto su una superficie e non c’è in genere modo per un utente di interagire con loro.

Questo è il comportamento previsto.

Per fornire funzionalità modificabili all’intestazione della tabella, dovrai fornire la tua implementazione di JTableHeader

Dai un’occhiata a questo esempio per alcune idee

Ecco un esempio che utilizza un JComboBox in un TableTable JTable.

Per altri tipi di componenti è più facile, dai un’occhiata qui .

inserisci la descrizione dell'immagine qui