# JComboBox in JTable immer sichtbar



## Mapara (6. Apr 2007)

Hallo!

Ich möchte gern die Combobox in der JTable anzeigen lassen, damit man weiß, dass es sich um eine Combobox handelt. Standardmäßig sieht man sie ja nur, wenn man auf die Zelle klickt! 

Marcus


----------



## André Uhres (6. Apr 2007)

Du brauchst einen TableCellRenderer:

```
...
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellRenderer(new MyComboBoxRenderer(values));
...
    public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
        public MyComboBoxRenderer(String[] items) {
            super(items);
        }
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }
            setSelectedItem(value);
            return this;
        }
    }
```


----------



## Mapara (6. Apr 2007)

Hi!

Danke erstmal für deine Antwort!

Das hatte ich auch versucht, aber irgendwie zeigt die Tabelle die Combobox trotzdem nicht an.  ???:L 
Ich hab auf die Spalte auch noch einen Editor gesetzt, da ich die gewählten Items in einen Vector schreiben will.

Irgendwie macht das so das gleiche wie vorher?

Vllt. ist auch noch nicht ganz klar geworden was ich meine:   
Also ich möchte beim Programmstart die Combobox in der Tabelle sehen, ohne das etwas selektiert wird. (Damit der Nutzer weiß, dass sich hinter der Zelle eine Combobox versteckt)

Marcus


----------



## André Uhres (6. Apr 2007)

```
/*
 * ComboDemo.java
 */
package table;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class ComboDemo extends JFrame {
    private JTable table;
    private DefaultTableModel model;
    public ComboDemo() {
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        table = new JTable();
        model = (DefaultTableModel)table.getModel();
        model.addColumn("A", new Object[]{"item1"});
        model.addColumn("B", new Object[]{"item2"});
        String[] values = new String[]{"item1", "item2", "item3"};
        int vColIndex = 0;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellEditor(new MyComboBoxEditor(values));
        col.setCellRenderer(new MyComboBoxRenderer(values));
        add(new JScrollPane(table));
    }
    public static void main(final String args[]) {new ComboDemo().setVisible(true);}
}
class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    public MyComboBoxRenderer(final String[] items) {
        super(items);
    }
    public Component getTableCellRendererComponent(final JTable table, final Object value,
            final boolean isSelected, final boolean hasFocus, final int row, final int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }
        setSelectedItem(value);
        return this;
    }
}
class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(final String[] items) {
        super(new JComboBox(items));
    }
}
```


----------



## Mapara (6. Apr 2007)

Vielen Dank!

Das hilft mir weiter!


----------



## Tolpan (17. Jun 2007)

Hallo

ich habe wie in dem Beispiel oben beschrieben die cellrenderer und editor implementiert und der tabelle übergeben
und es wird auch alles wunderschön gezeichnet.

Allerdings weiß ich nun nicht wie ich per methode Werte in das entsprechende Feld schreiben kann und diese dann auch in der Combobox angezeigt werden.
Wenn ich 
	
	
	
	





```
setValueAt(int, int)
```
 verwende legt mir die Tabelle ein Label über die Combobox mit dem value.
Wenn ich im Renderer direkt was reinschreibe wird es nicht sichtbar.

Bitte Helft mir

MfG Tolpan


----------



## André Uhres (18. Jun 2007)

Tolpan hat gesagt.:
			
		

> ..wie ich per methode Werte in das entsprechende Feld schreiben kann und diese dann auch in der Combobox angezeigt werden..




```
TableCellEditor ed = table.getCellEditor(0, 0);
JComboBox box = (JComboBox) ed.getTableCellEditorComponent(table, ed.getCellEditorValue(), true, 0, 0); 
String[] items = {"a", "b", "c", "d", "e"};
box.setModel(new DefaultComboBoxModel(items));
TableCellRenderer renderer = table.getCellRenderer(0, 0);
box = (JComboBox)renderer.getTableCellRendererComponent(table, table.getValueAt(0, 0), true, true, 0, 0);
box.setModel(new DefaultComboBoxModel(items));
table.updateUI();
```


----------



## Tolpan (18. Jun 2007)

Hi

danke schonmal das hat mich nen schritt weitergebracht

Allerdings steht nun in der gesamten Spalte ein und das selbe 
selbst in den Zellen die ich gar nicht angesprochen habe

ich hänge später nochmal etwas code an bin nur leider grade am falschen Rechner


MfG Tolpan


----------



## André Uhres (18. Jun 2007)

Versuch's mal hiermit:
http://www.java-forum.org/de/viewtopic.php?p=295107#295107


----------



## Tolpan (19. Jun 2007)

Wow

jetzt wo ich endlich verstanden hab was da passiert klappt es

Herzlichen Dank


mfg Tolpan


----------



## K-Man (22. Jun 2007)

Hallo
Ich habe den obigen Code verwendet, um eine ComboBox in eine Tabelle zu integrieren.
Folgende Methode greift bei Änderungen.


```
public void tableChanged(TableModelEvent e)
	{
		System.out.println(((JComboBox)table.getCellRenderer(table.getSelectedRow(), table.getSelectedColumn())).getSelectedItem());
		
	}
```

Leider wird mir hier nur das vorher selektierte Element der ComboBox ausgegeben. Das Ereignis hinkt also immer um eins zurückt. Wie kann ich das lösen?


----------



## André Uhres (22. Jun 2007)

Versuch's mal hiermit:
http://www.java-forum.org/de/viewtopic.php?p=295107#295107


----------



## K-Man (22. Jun 2007)

Vielen Dank.
Wie kann ich da aber auf die JComboBox zugreifen oder auf den Button wie in diesem Beispiel?
Mit getCellRenderer komm ich ja auf JComponentCellRenderer, kann da aber nicht auf JComboBox bzw JButton casten...


----------



## André Uhres (22. Jun 2007)

K-Man hat gesagt.:
			
		

> ..Wie kann ich da aber auf die JComboBox zugreifen oder auf den Button wie in diesem Beispiel?
> Mit getCellRenderer komm ich ja auf JComponentCellRenderer, kann da aber nicht auf JComboBox bzw JButton casten...


In actionPerformed vom ActionListener kommst du mit e.getSource() an die Komponente, die die Aktion 
ausgelöst hat (also den JButton bzw. die JComboBox). Im Beitrag auf den mein Link zeigt, da steht auch noch unten eine
Fussnote, die erklärt, wie du an die Koordinaten in der JTable rankommst.


----------



## K-Man (22. Jun 2007)

Ich glaube du verstehst mich falsch. Ich möchte zB in einer Methode den Wert aller ComboBoxen in der Tabelle abfragen. Dazu brauch ich zB so ne Art getComponentAt(row, column). Mit der kann ich auf ein beliebiges Feld in der Tabelle zugreifen und dann den selektierten Wert der Combobox abfragen.


----------



## André Uhres (22. Jun 2007)

```
for (int row = 0; row < table.getRowCount(); row++) {
            for (int column = 0; column < table.getColumnCount(); column++) {
                Object value = table.getValueAt(row, column);
                if(value instanceof JComboBox){
                    JComboBox box = (JComboBox)value;
                    String item = box.getSelectedItem().toString();
                    System.out.println("Value of JComboBox: "+item);
                }
            }
        }
```


----------



## Guest (22. Jun 2007)

Danke dir. Werd ich am Montag gleich ausprobieren :toll:


----------

