Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Combobox in Table met verschillende items

Pagina: 1
Acties:

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 13-11 10:23
Ik heb een JTable waarin een kolom zit waar JComboxen in zitten.
In elke row die ik toevoeg zit dus een Combobox, en deze wil ik vullen met verschillende items.

Eerst maak ik de Table aan, en de custom renderers:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
JComboBox comboBox = new JComboBox();
JTable jTable = new JTable();
DefaultTableModel tableModel = new DefaultTableModel();

tableModel.addColumn("Kolom");
jTable.setModel(tableModel);

comboBox.setRenderer(new DefaultListCellRenderer() {
  @Override
  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);           
                
    if (value instanceof Map) {
      Map m = (HashMap)value;
      setText((String)m.get("text"));
    }

    return this;
  }
});

TableColumn boxKolom = jTable.getColumnModel().getColumn(0);
boxKolom.setCellEditor(new DefaultCellEditor(comboBox));

Hierna wil ik rows kunnen toevoegen, waarbij de rows dus mogelijk verschillende items in de combobox kunnen krijgen.
Hoe krijg ik dit voor elkaar? Deze code werkt niet:
Java:
1
2
3
4
5
6
7
Map<String, String> item1 = new HashMap<String, String>();
item1.put("text", "rij 1");
Map<String, String> item2 = new HashMap<String, String>();
item2.put("text", "rij 2");

tableModel.addRow(new Object[]{item1});
tableModel.addRow(new Object[]{item2});

Bovendien bestaat nu de lijst in elke rij uit 1 item, dat moeten er ook meer worden.

Ik weet dat een HashMap als datatype in dit voorbeeld niet logisch lijkt, maar dit voorbeeld is vereenvoudigd.

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17:54

Haan

dotnetter

Lukt het sowieso wel om een simpele lege tabel te maken met rijen en kolommen?

Ik weet niet of C# en Java hierin hetzelfde zijn, maar in C# doe je (in pseudocode) dit als je een tabel maakt:
-maak table
-maak row
-for each cell in row: maak cell en add cell to row
-add row to table
(etc voor iedere volgende rij)

Jij begint zo te zien nu met het creeëren van een kolom, nogmaals misschien is dat in Java wel de manier, maar dan zou je dus bovenstaande voorbeeld 'andersom' moeten bekijken.

Kater? Eerst water, de rest komt later


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 13-11 10:23
De tabel wordt wel gemaakt, en de combobox verschijnt wel als ik de row aanmaak maar dan staat er dit in: {text=rij 1}.

Als ik de opties bekijk in de combobox zijn die leeg.

Zoals ik het wil, maak ik eerst de tabel en komen er later rows bij die een combobox hebben die verschillende/unieke items bevat.

Want het toevoegen van een combobox met een standaard aantal items is eenvoudig te doen. Zie:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
JComboBox comboBox = new JComboBox();
JTable jTable = new JTable();
DefaultTableModel tableModel = new DefaultTableModel();

tableModel.addColumn("Kolom");
jTable.setModel(tableModel);

//////////////////
// Dit om standaard combobox met items toe te voegen
Map<String, String> item1 = new HashMap<String, String>();
item1.put("text", "rij 1");
Map<String, String> item2 = new HashMap<String, String>();
item2.put("text", "rij 2"); 

comboBox.addItem(item1);
comboBox.addItem(item2);
/////////////////////////
/////////////////////////

comboBox.setRenderer(new DefaultListCellRenderer() {
  @Override
  public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);           
                
    if (value instanceof Map) {
      Map m = (HashMap)value;
      setText((String)m.get("text"));
    }

    return this;
  }
});

TableColumn boxKolom = jTable.getColumnModel().getColumn(0);
boxKolom.setCellEditor(new DefaultCellEditor(comboBox));

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:37

Robtimus

me Robtimus no like you

Als ik het goed begrijp wil je dus voor alle rijen een combo box in die kolom, alleen de inhoud moet anders zijn?

Als dit klopt dan moet je ook een custom cell editor gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyEditor extends DefaultCellEditor
{
    public MyEditor(JComboBox combo)
    {
        super(combo);
    }

    public Component getTableCellEditorComponent(...)
    {
        JComboBox combo = (JComboBox)super.getTableCellEditorComponent(...);
        combo.removeAllItems();
        Object[] items = getItemsForObject(value);
        for (Object o: items)
        {
            combo.add(o);
        }
        return combo;
    }
}

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • CyBoB
  • Registratie: Januari 2001
  • Laatst online: 14-10 16:48

CyBoB

.::BURB::.

Ik moet vooraf zeggen dat ik dit zelf nog nooit heb gedaan, maar is het geen idee om een eigen TableCellEditor te maken die in de getTableCellEditorComponent functie steeds een nieuwe combobox instance terug geeft die gevuld met de juiste waardes uit de Hashmap? (het value object dat aan de functie word meegegeven)

edit: doh IceManX was me net voor :)

[ Voor 3% gewijzigd door CyBoB op 12-03-2008 13:05 ]


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 13-11 10:23
IceManX schreef op woensdag 12 maart 2008 @ 13:04:
Als ik het goed begrijp wil je dus voor alle rijen een combo box in die kolom, alleen de inhoud moet anders zijn?

Als dit klopt dan moet je ook een custom cell editor gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyEditor extends DefaultCellEditor
{
    public MyEditor(JComboBox combo)
    {
        super(combo);
    }

    public Component getTableCellEditorComponent(...)
    {
        JComboBox combo = (JComboBox)super.getTableCellEditorComponent(...);
        combo.removeAllItems();
        Object[] items = getItemsForObject(value);
        for (Object o: items)
        {
            combo.add(o);
        }
        return combo;
    }
}
Ik probeer al een tijdje het in te voegen in me code maar het wil niet echt lukken.
Kun je aangeven waar in me voorbeeld code ik de wijziging moet aanbrengen?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:37

Robtimus

me Robtimus no like you

In plaats van
Java:
1
boxKolom.setCellEditor(new DefaultCellEditor(comboBox));
roep je
Java:
1
boxKolom.setCellEditor(new MyEditor(comboBox));
aan.
Waar je wel zelf voor moet zorgen is de implementatie van getItemsForObject, die overigens ook best een Collection kan returnen, dat hoeft geen array te zijn. Grote kans dat het een inner class wordt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1