How to make the JComboBox table editor have a regular JComboBox design?

I have a JComboBox that is used as an editor in JTable . In the picture you can see them in the Produs column. I would like to use the standalone JComboBox in the grid cells, especially on the right side of the combo box where the triangle is not in the grid cells, so the user will know that the grid cells are combined fields without having to click on one of them. How can I apply a JComboBox ( IsBackFlush ) construct to JComboBoxes in a grid?

Essentially, how can I create comboBox2 based on the design of comboBox1 ? Thanks.

cropped image

+1
source share
2 answers

When working with this complete example as a common frame of reference, note how the appearance of unselected cells in the ITEM_COL column ITEM_COL due to the default rendering . The arrow button, typical of a stand-alone JComboBox , appears only when the cell editor is called, for example, by clicking on a cell or pressing Space when a cell is selected. You can add a triangle to your custom renderer:

 final JComboBox combo = new JComboBox(items); TableColumn col = table.getColumnModel().getColumn(ITEM_COL); col.setCellRenderer(new DefaultTableCellRenderer(){ @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); label.setIcon(UIManager.getIcon("Table.descendingSortIcon")); return label; } }); 

Appendix: A more complete example due to @aterai is shown here .

+4
source

In the spirit of moving forward, I was going to publish the solution that I spoke about earlier. This solution actually uses comboBox as a visualization tool. Thus, it will look just like a real comboBox in any LAF. The problem is that the text is compressed, so I like the trashgod implementation better.

 import java.awt.*; import java.awt.event.*; import java.util.List; import java.util.ArrayList; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; public class TableComboBoxByRow extends JFrame { List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3); public TableComboBoxByRow() { // Create the editors to be used for each row String[] items1 = { "Red", "Blue", "Green" }; JComboBox comboBox1 = new JComboBox( items1 ); DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 ); editors.add( dce1 ); String[] items2 = { "Circle", "Square", "Triangle" }; JComboBox comboBox2 = new JComboBox( items2 ); DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 ); editors.add( dce2 ); String[] items3 = { "Apple", "Orange", "Banana" }; JComboBox comboBox3 = new JComboBox( items3 ); DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 ); editors.add( dce3 ); // Create the table with default data Object[][] data = { {"Color", "Red"}, {"Shape", "Square"}, {"Fruit", "Banana"}, {"Plain", "Text"} }; String[] columnNames = {"Type","Value"}; DefaultTableModel model = new DefaultTableModel(data, columnNames); JTable table = new JTable(model) { // Determine editor to be used by row public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); if (modelColumn == 1 && row < 3) return editors.get(row); else return super.getCellEditor(row, column); } }; JScrollPane scrollPane = new JScrollPane( table ); getContentPane().add( scrollPane ); table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer() ); } class ComboBoxRenderer extends JComboBox implements TableCellRenderer { public ComboBoxRenderer() { setBorder(new EmptyBorder(0, 0, 0, 0)); } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // setFocusable(false); removeAllItems(); addItem( value ); return this; } } public static void main(String[] args) { TableComboBoxByRow frame = new TableComboBoxByRow(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setVisible(true); } } 
+3
source

Source: https://habr.com/ru/post/1439146/


All Articles