JTable Listselectionlistener friert das Programm ein

grafsoft

Mitglied
Hallo,

wenn ich eine Zeile in der jTable anklicke und daraufhin andere Bildschirmelemente befülle, geht die Auswahl verloren bzw. wird unsichtbar.

Das heißt ich müsste die Zeile programmtechnisch wieder fokussieren. Bei jedem dieser Versuche friert das Programm ein. Wenn ich diese Versuche woanders ausprobiere, detto.

Java:
class uSelectionListener implements ListSelectionListener {

        JTable table;

        uSelectionListener(JTable table) {
            this.table = table;
        }

        public void valueChanged(ListSelectionEvent eve) {
            if (eve.getValueIsAdjusting()) {
                return;
            }
            int selectedrow = table.getSelectedRow();
            uselectedrow = selectedrow;
            int selectedcolumn = table.getSelectedColumn();
            if (selectedrow < 0) {
                return;
            }
            // System.out.println("uSelectedrow=" + selectedrow);

            if ((eve.getSource() == table.getSelectionModel()) && table.getRowSelectionAllowed()) {
                try {
                    DefaultTableModel model = (DefaultTableModel) table.getModel();
                    Object object = model.getValueAt(selectedrow, 0);
                    if (object != null) {
                        Lurl.setText(object.toString().trim());
                        String s = model.getValueAt(selectedrow, 2).toString().trim();
                        Lurltext.setText(s);
                        Lurltext.setCaretPosition(Math.round(Lurltext.getDocument().getLength() / 2));

                        if (model.getValueAt(selectedrow, 3) == null) {
                            s = "";
                        } else {
                            s = model.getValueAt(selectedrow, 3).toString().trim();
                        }
                        Turlassign.setText(s);
                        selectedurl = model.getValueAt(selectedrow, 4).toString().trim();

                        // die beiden befüllen 2 labels nachDatenbankapfragen
                        checkbassign();
                        fillassign();
                        
                        // Das sind meine Versuche: 
                        // table.changeSelection(selectedrow,1,false,false);
                        // table.changeSelection(selectedrow,3,false,true);
                        // table.repaint();
                        // table.getSelectionModel().setSelectionInterval(1, 1);
                        // table.clearSelection();
                        // table.addRowSelectionInterval(5, 5);
                        // SwingUtilities.invokeLater(() -> table.changeSelection(selectedrow,1,false,false));
                    }
                } catch (Exception ex) {
                    System.err.println(ex);
                    ex.printStackTrace();
                }

            }

        }
    }
 
Also ich sehe da nichts, das ein einfrieren verursachen könnte. Das deutet in der Regel auf ein blockieren des UI Threads hin und das würde ich mal prüfen (z.B. Breakpoint setzen in dem Code und dann Schritt für Schritt durchgehen.

Damit etwas selektiert werden kann, sollte SelectionMode und RowSelectionAllowed gesetzt sein.
Und dann ist der Aufruf von setRowSelectionInterval der Weg, den ich in der Regel durchführen würde. (clearSelection und addRowSelectionInterval sollte aber ebenso funktionieren und nichts anderes machen.)
 
Danke, ich hätte früher debuggen müssen.

Es war eine Endlosschleife, offenbar hat das setzen des Fokus immer wieder den Listener aufgerufen.

Außerdem hat eine andere Funktion immer wieder die Tabelle neu befüllt, klar ist da der Fokus weg.

Auf das hätt ich auch ohne Hilfe schreien draufkommen können, bin ich aber lange nicht. Sorry ...
 
Das man da erst auf den Link gehen muss um zu sehen, was man besorgen soll (Badeenten)….

Aber so Du meinst: Wenn man eine Lösung nicht sieht dann abschalten (z.B. Badewanne mit solchen Badeenten) und dann noch einmal ruhig schauen, dann ist das richtig. Das ist auch etwas, dass ich empfehle und praktiziere….

Danke, ich hätte früher debuggen müssen
Das ist halt manchmal nicht ganz so trivial. Das Problem ist ja, dass man mitten drin steckt und dann halt auch eine Blindheit entwickelt. Daher kann da etwas Abstand helfen … (was Robert wohl vorschlagen wollte - so ich ihn richtig verstanden habe)
 
Das man da erst auf den Link gehen muss um zu sehen, was man besorgen soll (Badeenten)….
Ja klar, ich tippe den Text ja nicht ohne Grund so. 😉

Aber so Du meinst: Wenn man eine Lösung nicht sieht dann abschalten (z.B. Badewanne mit solchen Badeenten) und dann noch einmal ruhig schauen, dann ist das richtig. Das ist auch etwas, dass ich empfehle und praktiziere….
Das hatte ich nicht gemeint, aber ist definitiv eine gute Loesung. Manchmal braucht man einfach etwas Abstand im Kopf, dass muss gar nicht eine Job- oder Projektwechsel sein, manchmal reicht eben auch die Badewanne.

Und fuer alle die es nicht kennen, Badeenten sind des Programmierer's Sorgenfresser. Man erklaert das Problem nochmal lang und breit, am besten von Anfang an, der Gummiente, und stellt sich dabei vor dass die Gummiente immer Zwischenfragen und Nachfragen stellt wie genau das ist.

Damit kommt man schon selbst auf viele Fehler d'rauf (ist etwas aus der Reihe "Konrad hasst diese 5 Tricks fuer Programmierer wie sie ihre Probleme selbst loesen koennen!"). 😉
 
Ach ja ... stimmt ... das mit dem stillen Zuhörer ... das habe ich schon mal gehört, aber so selbst noch nicht praktiziert 🙂
 
Ich habe einen Freund und Kollegen, den frag ich bei PHP und BS-Problemen. Aber anstatt anzurufen formuliere ich ein Email mit der Frage, möglichst so, dass er sie auf Anhieb verstehen kann. 3/4 der Mails brauche ich dann nicht abzuschicken, weil ich dabei auf die Lösung komme 🙂
 

Neue Themen


Zurück
Oben