JComboBox in JTable immer sichtbar

Status
Nicht offen für weitere Antworten.

Mapara

Mitglied
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
 
Du brauchst einen TableCellRenderer:
Code:
...
        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;
        }
    }
 
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
 
Code:
/*
 * 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));
    }
}
 
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
Code:
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
 
Tolpan hat gesagt.:
..wie ich per methode Werte in das entsprechende Feld schreiben kann und diese dann auch in der Combobox angezeigt werden..
Code:
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();
 
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
 
Wow

jetzt wo ich endlich verstanden hab was da passiert klappt es

Herzlichen Dank


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

Code:
	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?
 
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...
 
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.
 
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.
 
Code:
       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);
                }
            }
        }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben