Probleme mit Swing Timer

renek

Mitglied
Hallo zusammen,

ich habe ein kleines Problem. Ich habe ein kleines Applet auf dem mehrere Checkboxen sind welche sich in einer jTable befinden. Über ein tableChanged Event frage den Status der Checkboxen ab und verarbeite ihn.

Java:
table1 = new JTable(dm1) {
                public void tableChanged(TableModelEvent e) {
                    int x;
                    int y;
                    y = e.getFirstRow();
                    x = e.getColumn();
                    System.out.println("tableChanged (" + y + "," + x + ")");
                    if (x == 0 && y >= 0) {
                        System.out.println("Radiobutton change");
                        connection.ChannelSelect(y + 1);
                    }
                    if (x == 2 && y >= 0) {
                        System.out.println("Checkbox change");
                        connection.setChannel(getCheckBoxes());
                    }
                    super.tableChanged(e);
                    repaint();
                }
            };

So weit so gut. Nun habe ich noch einen SwingTimer in die Start() Funktion eingebaut.

Java:
ActionListener taskPerformer = new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    System.out.println ("Timer");
                    <Aufruf von Updatefunktionen für die Checkboxen>
                }
            };
        t = new Timer(1000, taskPerformer);
        t.start();

Sobald ich im Timer die Updatefunktion aktiviere funktioniert im tableChanged Event das Auslesen der Checkboxen nicht mehr.

Java:
    private String[] getCheckBoxes()    {
        int i = 0;
        String son = "";
        String soff = "";
        String[] res = new String[2];
        
        res[0] = "";
        res[1] = "";

        for (i=0; i<table1.getRowCount(); i++)
        {
            System.out.println ("getCheckBoxes " + i);
            if (((JCheckBox)dm1.getValueAt(i,2)).getSelectedObjects() != null)
                son=son+(i+1)+",";
            else
                soff=soff+(i+1)+",";
        }
        System.out.println ("son: " + son);
        System.out.println ("son: " + soff);
        if (son.length() > 0)
            res[0] = son.substring(0, son.length()-1);
        if (soff.length() > 0)
            res[1] = soff.substring(0, soff.length()-1);

        return res;
    }

Es scheint so als ob der Timer die GUI sperren würde und kein Update mehr durchgeführt werden würde.
Hat jemand eine Idee oder ein ähnliches Verhalten schon mal gehabt?

Gruß René
 
Wie lange dauert denn die Update Methode?
Solange diese dauert ist der EDT (GUI-Thread) blockiert.
 
Hi,

also das Update dauert nicht lange. Also es spielt sich im 100 ms Bereich ab.
Kann es sein, dass sich das Table Event und der Timer den gleichen Zeitschlitz teilen und ich deshalb nicht mehr auf die Checkboxen zugreifen kann? Es kommt aber keine Fehlermeldung.
Auf die Checkboxen kann ich noch klicken. Der Status ändert sich auch. Also der Haken kommt und geht. Nur der Interne Status oder wie auch immer ändert sich nicht. Mit der Funktion getCheckBoxes() kann ich den Status auf jedenfall nicht mehr auslesen 🙁

Gruß René
 
hi SirWayne,

ok...ich Versuch aus dem Projekt etwas kleines Lauffähiges zu machen. Leider besorgt sich das Applet von einem externen Controller Daten. Diese Funktionen muss ich erst noch durch Dummyfunktionen ersetzen.
Aber ein kleines Beispiel wird kommen.

Gruß René
 
Hi,

so..nun habe ich mein Projekt etwas verkleinert.
Nach Start erscheint eine Tabelle mit zwei Checkboxen. Im Hintergrund läuft ein Timer der die Checkboxen immer aktualisiert.
Bei Klick auf eine Checkbox wird der Wert ausgelesen und im Debugfenster angezeigt.

Wenn man Zeile 62 auskommentiert funktioniert das Auslesen der Checkboxen. Mit Zeile 62 nicht mehr. Zu sehen an der Ausgabe.

Beide Checkboxen an: so=1,2, soff=
Beide Checkboxen aus: so= soff=1,2,

Ich hoffe das Beispiel mach das Problem sichtbar.

Gruß René
 

Anhänge

Guten Morgen,

ich habe die Stelle gefunden an der mein Programm Mist gebaut hat. In der Funktion setdatatbl1() habe ich das Tabellen löschen durch die Funktion dm1 = new myModel1(); gelöst. Dies verursachte aber meine Probleme. Nun lösche ich die Tabelle mittels
Java:
          dm1.setNumRows(0);

            if (dm1.getColumnCount()!=5)
            {
                dm1.addColumn("HF");
                dm1.addColumn("Kanal");
                dm1.addColumn("Ein");
                dm1.addColumn("Spannung (U)");
                dm1.addColumn("Strom (I)");
            }

und lege die Spalten nur einmal an.
Ist vielleicht nicht die beste Lösung aber für mich geht es erstmal.

Gruß René
 

Neue Themen


Zurück
Oben