Darstellungs Problem mit ComboBox in JTable

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

Ich benutze für meine Table einen eigenen Renderer und Editor um ComboBoxen in der Tabelle darstellen zu können.
Ich will eigentlich folgendes haben: Wenn die Zelle nicht angeklickt ist soll man die Combobox nicht sehen nur wenn man darauf klickt. Das aktuelle Problem ist das man zwar auf eine Zelle klicken kann und auch etwas aus der Box auswählen kann doch beim verlassen der Zelle ist die Auswahl weg und man hat wieder ein leeres Feld.
Hier mal der Code:
Code:
table.getColumnModel().getColumn(1).setCellEditor(new ComboBoxEditor());
table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer());

class ComboBoxRenderer extends DefaultTableCellRenderer
{
    public Component getTableCellRendererComponent(JTable table,final Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    {
        return this;
    }

}

class ComboBoxEditor extends JComboBox implements TableCellEditor
{
    protected JComponent editorComponent = null;
    private Vector listeners = new Vector();
    protected EventListenerList listenerList = new EventListenerList();
    protected transient ChangeEvent changeEvent = null;
    
    public ComboBoxEditor()
    {
        super(new Object[] {"","Eins","Zwei","Drei"});
    }
    
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) 
    {
        return this;       
    }

    public Object getCellEditorValue() 
    {
        return editorComponent;
    }

    public boolean isCellEditable(EventObject anEvent) 
    {
        return true;
    }

    public boolean shouldSelectCell(EventObject anEvent) 
    {
        return true;
    }

    public boolean stopCellEditing() 
    {
        fireEditingStopped();
        return true;
    }

    public void cancelCellEditing() 
    {
       fireEditingCanceled(); 
    }

    public void addCellEditorListener(CellEditorListener l) 
    {
    }

    public void removeCellEditorListener(CellEditorListener l) 
    {
    }
   
    protected void fireEditingCanceled()
  {
    ChangeEvent e = new ChangeEvent(this);
    for(int i = 0,n = listeners.size();i<n;i++)
      ((CellEditorListener)listeners.get(i)).editingCanceled(e);
  }

  protected void fireEditingStopped()
  {
    ChangeEvent e = new ChangeEvent(this);
    for(int i = 0,n = listeners.size();i<n;i++)
      ((CellEditorListener)listeners.get(i)).editingStopped(e);
  }
        
}

Also irgendwas stimmt wohl am Renderer nicht, hab aber momentan nicht so den Plan an was es liegen könnte.
Also hab auch noch andere Sachen ausprobiert die aber alle massig Fehler mit sich brachten. Das oben funktioniert soweit auch, mal davon abgesehen das die Zellen immer leer bleiben ausser wenn man sie editiert.
Hab auch schon so was wie setText((String)value); über der return this; Zeile im Renderer versucht, hat aber null gebracht.
 
G

Gast

Gast
Also wenns irgendwelche Fragen geben sollte zum Problem, bitte stellen. Ich werd mich bemühen alles zu beantworten.
 
B

Beni

Gast
Wenn fertig editiert ist, ruft die JTable "getCellEditorValue" auf, und schreibt den Rückgabewert mit Hilfe von "setValueAt" in das TableModel.

:arrow: getCellEditorValue richtig implementierten. Hier sollte die Selektion der ComboBox zurückgegeben werden, nicht die ComboBox selbst.
:arrow: sicherstellen, dass die Methode setValueAt auch im Model implementiert ist.

Ein anderes Thema ist, dass dein ComboBoxRenderer überhaupt garnichts macht.

:arrow: Der Renderer soll das Argument "value" in "getTableCellRendererComponent" nicht einfach ignorieren.
 
G

Gast

Gast
Also muss getCellEditorValue folgendes zurückgeben
return this.getSelectedItem(); ?
Was müsste denn in die setValueAt Methode im TableModel reingeschrieben werden?
Brauch ich denn überhaupt einen eigenen Renderer wenn ich nur will das ein Label in der Zelle steht und nicht die ComboBox? (Also natürlich nur wenn man gerade nicht editiert)
Hab auch schon probiert den Value in getTableCellRendererComponent zurückzugeben mit :
return (Component) value;
aber dann kommt immer folgende Fehler Meldung dass er keinen String in Component casten kann.

zu André:
Das ist ja ein universelles Model in dem man dann nach belieben einsetzen kann was man benötigt. Kann man da Icons einsetzen wie sie hier benutzt werden
http://www.java-forum.org/de/topic56466_jtable-icons-db-speichern.html
Man benutzt ja für alle Komponenten den gleichen Renderer, was ist wenn man zb wie ich für die ComboBox oben machen will das sie nur sichtbar ist wenn man die Zelle editiert oder irgendwelche anderen Eigenschaften einer Kompononte ändern will die nicht so allgemein sind?
Mit meiner Methode oben würde ich die Renderer ja spaltenweise setzen und mit deinem Beispiel muss man ja für jede Zeile in der Tabelle die Methode getCombo aufrufen, die dann eine neue ComboBox erstellt. Wie ist das dann von der Performance her?
 

André Uhres

Top Contributor
Gast hat gesagt.:
..zu André:
Das ist ja ein universelles Model in dem man dann nach belieben einsetzen kann was man benötigt.
Kann man da Icons einsetzen wie sie hier benutzt werden
http://www.java-forum.org/de/topic56466_jtable-icons-db-speichern.html
Null Problemo: eine JTable kann mehrere Renderer haben
(wenn man getCellRenderer und getCellEditor wie angegeben implementiert,
dann sollte automatisch der richtige Renderer/Editor ausgewählt werden).

Gast hat gesagt.:
Man benutzt ja für alle Komponenten den gleichen Renderer,
was ist wenn man zb wie ich für die ComboBox oben machen will
das sie nur sichtbar ist wenn man die Zelle editiert
oder irgendwelche anderen Eigenschaften einer Kompononte ändern will die nicht so allgemein sind?
Entweder wie ich es im Beispiel gemacht habe, oder z.B. für JComboBox.class einen eigenen Renderer schreiben:
Code:
table.setDefaultRenderer(JComboBox.class, new JComboboxRenderer());

Gast hat gesagt.:
Mit meiner Methode oben würde ich die Renderer ja spaltenweise setzen
und mit deinem Beispiel muss man ja für jede Zeile in der Tabelle die Methode getCombo aufrufen,
die dann eine neue ComboBox erstellt. Wie ist das dann von der Performance her?
Null Problemo für kleinere Sachen, wie mein Beispiel mit 1000 Boxen zeigt
(braucht selbstverständlich mehr Platz als deine Methode).
 
B

Beni

Gast
Gast hat gesagt.:
Also muss getCellEditorValue folgendes zurückgeben
return this.getSelectedItem(); ?
Ja

Was müsste denn in die setValueAt Methode im TableModel reingeschrieben werden?
Kommt halt draufan wie du dein Model geschrieben hast. Aber pseudocodemässig wird es sowas sein:
Code:
Object[][] data = ... // Die Daten in deinem Model
data[row][column] = newValue; // neuer Wert speichern

Brauch ich denn überhaupt einen eigenen Renderer wenn ich nur will das ein Label in der Zelle steht und nicht die ComboBox? (Also natürlich nur wenn man gerade nicht editiert)
Wenn du unformatierten Text anzeigen willst: dann brauchst du keinen eigenen Renderer.
 

André Uhres

Top Contributor
Man kann auch die Defaultsachen nutzen:
Code:
package table;

/*
 * TableComboboxes2.java
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboboxes2 {

    public TableComboboxes2() {
        JTable table = new JTable();
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.addColumn("A", new Object[]{"item1"});
        model.addColumn("B", new Object[]{"item2"});
        model.addRow(new Object[]{"item3", "item4"});
        String[] values = new String[]{"item1", "item2", "item3"};
        TableColumn col = table.getColumnModel().getColumn(0);
        col.setCellEditor(new MyComboBoxEditor(values));
        table.setRowHeight(20);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        JPanel tableContainer = new JPanel(new BorderLayout());
        tableContainer.add(table.getTableHeader(), BorderLayout.NORTH);
        tableContainer.add(table);
        f.add(tableContainer);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new TableComboboxes2();
    }

    public class MyComboBoxEditor extends DefaultCellEditor {

        public MyComboBoxEditor(String[] items) {
            super(new JComboBox(items));
        }
    }
}
 
G

Gast

Gast
Also ich hab die Daten über einen Vector in das TableModel geschrieben. Hab folgendes versucht :

Code:
private Vector Data;
    
public OmdbTableModel(Vector RowData, Vector ColumnNames) 
    {
        super(RowData, ColumnNames);
        Data = RowData;
        
    }

    public void setValueAt(Object aValue, int row, int column) 
    {
        Vector store = (Vector)(Data.get(row));
        store.set(column, aValue);
        Data.set(row,store);      
    }

Das hat aber leider nicht funktioniert.
Müsste ich da ein Object Array für die Daten nehmen, oder geht das auch mit nem Vector?
 

André Uhres

Top Contributor
Geht auch mit Vector.
Dies ist überflüssig:
Code:
Data.set(row,store);
und dies fehlt:
Code:
fireTableCellUpdated(row, column);
Falls du von DefaultTableModel ableitest, ist die ganze Methode überflüssig :wink:
 
G

Gast

Gast
Ja wenn ich einfach ein DefaultTableModel nehme mit
DefaultTableModel model = new DefaultTableModel(Vector1, Vector2);
dann hab ich aber genau das gleiche Problem das ich in den Zellen nichts sehen kann.
 
G

Gast

Gast
Achja vielleicht nochwas,
irgendwie scheint er für jede Zelle dieselbe ComboBox zu nehmen.
Das beudeutet wenn ich in Zelle 1 den 3. Wert in der Box auswähle dann in irgendeine andere Zelle klicke ist der 3. Wert schon ausgewählt. (oder wenn ich in der 5. Zelle wert 2 auswähle dann ist in allen anderen Zellen auch Wert 2 ausgewählt usw)
 

André Uhres

Top Contributor
>dann hab ich aber genau das gleiche Problem das ich in den Zellen nichts sehen kann.
>irgendwie scheint er für jede Zelle dieselbe ComboBox zu nehmen.

Kann ich nicht bestätigen, bei mir funzt das wie ne Uhr :wink:
Code:
       Vector<String> headerData = new Vector<String>();
        headerData.add("Title 1");
        headerData.add("Title 2");
        Vector<Vector> tableData = new Vector<Vector>();
        for (int i = 0; i < 50; i++) {
            Vector<Object> rowData = new Vector<Object>();
            rowData.add("combo item1");
            rowData.add("simple item");
            tableData.add(rowData);
        }
        model = new DefaultTableModel(tableData, headerData);
        table = new JTable(model);
        String[] comboValues = new String[]{"combo item1", "combo item2", "combo item3", "combo item4"};
        table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JComboBox(comboValues)));
 
G

Gast

Gast
oh ja haste Recht. Wundbar so funzt das ja schon mal, aber das Problem das der Wert vorausgewählt ist den man in der zuvor editierten Zelle selektiert hat, besteht weiterhin. Naja nicht so tragisch.
Aber dennoch, was stimmt denn an meinem Editor oben nicht das dieser nicht funktioniert, vielleicht brauch ich ihn ja doch nochmal falls ich an der Combobox noch irgendwelche extra Änderungen vornehmen will.
 
M

mylord

Gast
Aber ich habe dann bei diesem Beispiel das Problem, dass in jeder Zeile der Tabelle eine Combobox ist (ich möchte die aber nur in einer Zeile haben) und dass jede Combobox die gleichen Werte zur Auswahl liefert. Wie kann ich das denn lösen?
 

André Uhres

Top Contributor
mylord hat gesagt.:
Aber ich habe dann bei diesem Beispiel das Problem, dass in jeder Zeile der Tabelle eine Combobox ist (ich möchte die aber nur in einer Zeile haben) und dass jede Combobox die gleichen Werte zur Auswahl liefert. Wie kann ich das denn lösen?
Oben im 4. Beitrag ein Link auf TableComboboxes.java
mit einer alternativen Lösung die für dich passen müsste :wink:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JButton auf JPanel in JTable (Darstellungs-/Event-Probleme) AWT, Swing, JavaFX & SWT 16
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
P AWT Problem mit Platzierung (GridBagLayout) AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
A Mini-Menu-Schriften. Ein Problem bei hohen DPI Zahlen AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
G Swing Setvisible problem AWT, Swing, JavaFX & SWT 1
J JTabbedPane: close Button Problem AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX -> fxmlLoader -> getResourceAsStream Problem AWT, Swing, JavaFX & SWT 1
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
T LayoutManager LookAndFeel-Problem AWT, Swing, JavaFX & SWT 4
F Problem mit Implementierung von Kollisionsabfrage AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
B JavaFX Problem bei Kamera / Group, gesamte Scene bewegt sich mit AWT, Swing, JavaFX & SWT 0
L Swing Vier Gewinnt Problem AWT, Swing, JavaFX & SWT 2
Z GUI-Problem, finde meinen Fehler nicht! AWT, Swing, JavaFX & SWT 11
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben