tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von inter
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
860
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Moltar
    Moltar Moltar ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    53
    Hallo,

    ich habe ein JFrame mit einer JTable. In der ersten Spalte der Tabelle stehen einfache Texte, soweit alles kein Problem. Die zweite Spalte wird mit JComboBox dargestellt und editiert, da ich hier nur einige vorgegebene Werte zur Auswahl stellen möchte.

    Wenn ich nun auf ein Feld aus der 2. Spalte klicke und der aktuelle Fokus nicht auf derselben Zeile ist, muss ich ein zweites mal auf das Feld klicken, damit die JComboBox geöffnet wird. Schön wäre aber, wenn gleich beim ersten Klick die Liste mit den Auswahlmöglichkeiten angezeigt wird.

    Würde mich über jeden Hinweis freuen.

    Hier noch mein Zelleditor:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    private class ComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
            private static final long serialVersionUID = 1L;
            private JComboBox component = new JComboBox(new String[] {"Auswahl A", "Auswahl B"});
     
            public Component getTableCellEditorComponent(JTable tab, Object value, boolean isSelected, int row, int col) {
                component.setSelectedItem((String)value);
                return component;
            }
     
            public Object getCellEditorValue() {
                return component.getSelectedItem();
            }
        }
     

  2. #2
    inter inter ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    26
    Hallo zusammen,

    ich versuche mich mal gleich mit meinem ersten Posting nützlich zu machen .

    Also ich habe das mal gerade flux ausprobiert und bei mir springt die Combobox direkt auf. Egal was vorher den Fokus besaß. Dabei habe ich die JTable wie folgt definiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
                jTable = new JTable(5,4) {
                    
                    
                    public TableCellEditor getCellEditor(int row, int col) {
                        switch (col) {
                        case 1:
                            return new ComboBoxEditor();    
                                
                        default: 
                            return super.getCellEditor(row, col);
                        }
                        
                    }
                };

    Vielleicht liegt es daran wie Du den CellEditor einbindest. Ein größerer Ausschnitt aus Deiner JTable - Klasse wäre interessant.
    Moltar bedankt sich. 

  3. #3
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    AFAIK geht das nur über einen MouseListener auf der JTable.
     

  4. #4
    Avatar von Moltar
    Moltar Moltar ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    53
    Hallo inter,

    danke erstmal für die schnelle Hilfe. Hier mein Konstrukt, mit dem ich die Tabelle anlege:

    Code :
    1
    2
    3
    4
    5
    6
    
    public void createTable() {
    DefaultTableModel tableModel = new DefaultTableModel(data, colHeads);
                table = new JTable(tableModel);
                table.getColumn("Typ").setCellRenderer(new ComboBoxRenderer());
                table.getColumn("Typ").setCellEditor(new ComboBoxEditor());
    }

    data ist ein String[][], der die Daten bereithält. colHeads ist String[] mit den Spaltennamen. Spalte 2 hat den Namen "Typ". Die Variable table ist in der Klasse bekannt durch:
    Code :
    1
    
    private JTable table = null;

    In deinem Code überschreibst du die getCellEditor-Methode. Muss ich das machen, wenn ich einen eigenen Zelleditor benutzen will?

    Moltar
     

  5. #5
    inter inter ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    26
    Zitat Zitat von Moltar Beitrag anzeigen
    [...]
    In deinem Code überschreibst du die getCellEditor-Methode. Muss ich das machen, wenn ich einen eigenen Zelleditor benutzen will?
    [..]
    Ne, "musst" Du nicht, aber das meinte ich mit "wie Du den CellEditor einbindest". Vielleicht würde der andere Weg schon Dein Problem lösen.

    Eine Möglichkeit, wieso das bei mir funktioniert, könnte das Betriebssystem sein. Ich habe es unter WinXP ausprobiert. Ich könnte mir vorstellen, dass andere Window Manager (z.B. unter Linux) die Messages zwischen den Fensterkomponenten anders verteilen. Dass der Klick also nicht bis zur ComboBox durchgereicht wird. Fall das bei Dir der Fall ist, müsste man wohl tatsächlich ein häßliches Workaround mit einem Listener basteln.
     

  6. #6
    Avatar von Moltar
    Moltar Moltar ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    53
    Hallo,

    es lag tatsächlich an der getCellEditor-Methode. Ich hab das bei mir jetzt analog zu deinem Codebeispiel eingebaut und es funktioniert

    Vielen vielen Dank!

    Ich habe zur Darstellung einen eigenen CellRenderer definiert, damit die Zelle immer als JComboBox angezeigt wird. Sollte ich analog die getCellRenderer(int, int) überschreiben? Bisher sind bei der Darstellung zwar noch keine Probleme aufgetreten, aber was nicht ist ....

    Nur noch zur Info: Ich verwende das Programm unter Win2000.
    Geändert von Moltar (04.05.07 um 14:01 Uhr)
     

  7. #7
    inter inter ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    26
    Super, freut mich, dass es funktioniert. Also ich würde der Ordnung halber den CellRenderer auch so einbinden, aber das ist Geschmackssache. Der Unterschied ist zwar nicht fühlbar, aber vielleicht interessant, wenn Dein Projekt mal größere Ausmaße annimmt. Bei Deiner Methode werden CellRenderer und CellEditor erst zur Laufzeit, d.h. jedes Mal wenn Du dein Programm startest an dem Table-Objekt angemeldet. Das ist theoretisch langsamer.
     

  8. #8
    Avatar von Moltar
    Moltar Moltar ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    53
    Hallo,

    so, ich habe jetzt den Editor und den Renderer wie in deinem Beispiel eingebaut. Da ich noch mehr Tabellen in der Art brauche, hab ich mal eine eigene Klasse draus gemacht.

    Danke nochmal für die schnelle und kompetente Hilfe.

    Grüße Moltar
     

Ähnliche Themen

  1. WPF 4 Kalender Button reagiert erst auf zweiten Klick
    Von Salle im Forum .NET WPF & Silverlight
    Antworten: 2
    Letzter Beitrag: 18.12.10, 10:42
  2. Antworten: 2
    Letzter Beitrag: 17.04.09, 19:37
  3. toggeln erst beim 2. klick - warum?
    Von SnEaKy im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 13.07.07, 12:04
  4. JTable, eine Zelle nicht editierbar machen
    Von Matze82 im Forum Java
    Antworten: 3
    Letzter Beitrag: 13.08.05, 15:39
  5. JTable nicht editierbar machen
    Von steveg im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 5
    Letzter Beitrag: 25.07.04, 23:14