Aktuellen GUI-Wert benutzen

Hallo alle,

ich sitze immer noch an meiner Arbeit und habe jetzt folgendes Problem:

Ich habe eine GUI erstellt, die mir per Buttonklicks und JSlides einen Wert zurückgibt. Diesen Wert möchte ich nun auf einen FPGA bringen. Die Klasse um die Ports anzusteuern habe ich auch schon fertig. Aber wie bekomme ich jetzt den aktuellen Wert aus meiner GUI? Also ich möchte, dass der User die gewünschten Buttons klickt und der entstehende Wert sofort weitergesendet wird. Ich habe in der GUI-Klasse eine getdata()-Methode. Aber wenn ich die benutze wird nur der Initialwert genommen. Wie kann ich den aktuellen Wert erhalten?

Oder muss ich in jedem ActionListener das “outputStream.write(data);” schreiben? Aber dann müsste ich ja auch jedes mal den Port öffnen/schließen…

Jemand ne Idee?

Danke!

Bin nicht ganz sicher, was du meinst, aber vielleicht was, was im PSEUDOcode so aussieht?

class GUI
{
    int value0;
    int value1;

    void init()
    {
        ...
        slider0.addChangeListener(new ChangeListener()
        {
            public void valueChanged()
            {
                value0 = slider0.getValue();
            }
        });

        slider1.addChangeListener(...)
    }

    // Wird aus dem ActionListener des Buttons aufgerufen:
    void sendWhenButtonWasPressed()
    {
        port.sendData(value0, value1);
    }

}

!?

Also das ich noch einen extra Button “senden” einbaue, bei dem dann der gewünschte Wert übertragen wird. Dann müsste ich nur einmal den Port öffnen/schließen(biem ActionListener von “senden”) und nicht in jedem Listener einzeln. Das würde wohl gehen.

Gibt es eine Möglichkeit, wenn ich eine exra Klasse für das senden des Datums benutzen möchte, dass ich hier den aktuellen Wert aus der Klasse GUI bekomme?

Danke schonmal, gute Idee!

jede andere Klasse (genauer die Objekt davon) als die GUI kann zu einem bestimmten Zeitpunkt X bei der GUI nachfragen, wenn sie die Klasse/ das Objekt kennt,
mit Interface sind auch abgeschwächte Lösungen möglich, oder es gibt eine Parameterübergabe zu Zeitpunkt X

die GUI kann auch zum Zeitpunkt der User-Änderung (weit vor X) die Daten verteilen, das muss nicht gleich irgendein Stream sein,
sondern in Variablen schreiben, in der GUI oder in anderen Klassen, wie auch immer

Möglichkeiten sind genug, alles recht unklar, nix konkret zu beantworten


was du ansonsten erzählst ist auch ähnlich unklar

Oder muss ich in jedem ActionListener das „outputStream.write(data);“ schreiben? Aber dann müsste ich ja auch jedes mal den Port öffnen/schließen…

in einem Stream schreibst du genau dann wenn du das für angebracht hältst,
das sollte nicht von GUI-Deteils abhängen sondern von deinem Plan, wann etwas gesendet wird, etwa nur bei Sende-Button,
zu dem Zeitpunkt muss dann natürlich auch Verbindung offen sein usw., das ergibt sich automatisch

wenn du irgendwann nicht senden willst, dann sende nicht!, man kann auch erstmal so im Programm Daten sammeln

Ich habe in der GUI-Klasse eine getdata()-Methode. Aber wenn ich die benutze wird nur der Initialwert genommen. Wie kann ich den aktuellen Wert erhalten?

hängt vom allgemeinen Aufbau hab, wenn getdata() ein Instanzattribut zurückgibt, muss dieses aktuell sein,
alternativ vielleicht auf die GUI-Komponente gehen, die schon aktueller sein sollte,
falls nicht einer von vielen möglichen Fehlern vorliegt,

ohne Code/ Details wenig zu sagen, auch wenn mein Posting viel länger als wünschenswert wird…

Also erstmal, das sich jemand als Java-Anfänger „unklar“ ausdrückt sollte verständlich sein und glaub mir, das mache ich nicht mit Absicht :wink:

Ich versuche hier immer das Problem auf das wesentliche zu beschränken, da ich ansonsten immer erstmal sehr viel zu erklären hätte. Verständlich sollte es natürlich trotzdem sein.

Also mit der GUI legt der User verschiedene Einstellungen fest. Zum Beispiel: LED Nr. 3 soll schnell blinken. Dafür drückt er auf den Button „Blinklicht“ und gibt dann die Nr. der LED ein und dann die Geschwindigkeit wieder per Buttonklick. Im ActionListener vom Button „schnell“ sage ich jetzt, dass „data“ = xyz ist. Dieses Vorgehen mache ich mit allen möglichen Auswahlmöglichkeiten. Jetzt möchte ich in meiner Klasse, in der ich die Port-Kommunikation steuere, dieses aktuelle data per stream auf mein FPGA senden.

die GUI kann auch zum Zeitpunkt der User-Änderung (weit vor X) die Daten verteilen

Genau darum geht es mir. Wie geht das?

in einem Stream schreibst du genau dann wenn du das für angebracht hältst,
das sollte nicht von GUI-Deteils abhängen sondern von deinem Plan, wann etwas gesendet wird, etwa nur bei Sende-Button,
zu dem Zeitpunkt muss dann natürlich auch Verbindung offen sein usw., das ergibt sich automatisc

Wie gesagt, der Plan war ursprünglich genau dann was zu senden, wenn der User seine Einstellung vorgenommen hat und der Sende-Button war nicht eingeplant, da ich auch einen Dimmer mit einem JSlide realisieren möchte und hier wäre es gut, wenn man direkt ein Ergebnis an den LEDs sieht und nicht jedes mal auf „Senden“ klicken muss

Grüße

wie von Marco13 gepostet kann jeder Komponente einen Listener bekommen, der bei jeder Änderung reagiert,
teils zu häufig, mehrere Ereignisse, das muss man zunächst genau untersuchen,

Buttons haben ihren ActionListener als ganz bekanntes Beispiel, andere können genauso reagieren,
da besteht kein struktureller Unterschied

im Listener kannst du beliebigen Code ausführen, Daten lokal in Attribute schreiben, an andere Klassen/ Objekte übergeben oder in Streams versenden,
zwischen den letzten beiden schwankst du wieder hin und her, vielleicht kombiniert: an Sende-Klasse übergeben die dann auch gleich sendet

[QUOTE=SlaterB]

im Listener kannst du beliebigen Code ausführen, Daten lokal in Attribute schreiben, an andere Klassen/ Objekte übergeben oder in Streams versenden,
zwischen den letzten beiden schwankst du wieder hin und her, vielleicht kombiniert: an Sende-Klasse übergeben die dann auch gleich sendet[/QUOTE]

Jap, genau das ist die Frage. Wie geht das übergeben der lokalen Attribute an die Sende-Klasse? Normalerweise ist das doch einfach Objektname.Attribut, aber das funktioniert bei mir nicht:

Ein Ausschnitt aus class “FrameNochBesser”. Hier soll bei klicken von btnmittelL folgendes data bestimmt werden.

    btnmittelL.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                if (links_rechts == 1){
                    data = 138;                                //10001010
                    }else{
                    data = 146;                                //10010010
                    }
            }
            });

Nun möchte ich in der Klasse Tester dieses data auf der Konsole anzeigen lassen:


public class Tester {
    
    public static void main(String[] args){
        
        FrameNochBesser y = new FrameNochBesser();
         System.out.println(y.data);
    }     

}```


Es wird wieder nur der Initialwert und nicht der aktuelle Wert angezeigt.

die Zeile 8 wird 2 Nanosekunden nach dem Anlegen der GUI in Zeile 7 ausgeführt,
da hat doch niemand eine Chance, etwas in der GUI zu ändern, wahrscheinlich noch gar nicht angezeigt

falls schon eine andere GUI offen ist, dann erzeugst du hier eine zweite GUI, das geht ja auch nicht,
aber es ist eine main-Methode, also eher der Programmstart

so geht das alles nicht, erstmal musst du dir überlegen, was passieren soll!
wann soll das System.out.println() erfolgen? doch wohl nicht von der main gesteuert, sondern erst wenn in der GUI agiert wird,
vom Listener aus gesteuert,

der Listener könnte nach Setzen der Daten in der Klasse Tester eine Methode ‘testeJetzt()’ starten, wenn dort dann auf das Frame zugegriffen wird
(kein neu erstelltes, sondern das laufende, das bekannt sein muss als Attribut), dann werden wohl die richtigen Daten gelesen,
oder gar nicht zurück im Frame lesen, die Daten bei ‘testeJetzt()’ als Parameter mit übergeben

von Frame-Sicht aus muss es für den Aufruf in jedem Fall auch erstmal ein erstelltes Tester-Objekt geben (welches evtl. die Frameklasse kennt), noch ein Instanzattribut,
so geht es hin und her, vielleicht viel Code ‘erstelle Object A, B, C/ A du kennst nun B/ B du kennst nun A’ usw.,
erscheint jetzt nach vielen Aufgaben auf einmal, aber das legt sich dann

[QUOTE=SlaterB]die Zeile 8 wird 2 Nanosekunden nach dem Anlegen der GUI in Zeile 7 ausgeführt,
da hat doch niemand eine Chance, etwas in der GUI zu ändern, wahrscheinlich noch gar nicht angezeigt

falls schon eine andere GUI offen ist, dann erzeugst du hier eine zweite GUI, das geht ja auch nicht,
aber es ist eine main-Methode, also eher der Programmstart

so geht das alles nicht, erstmal musst du dir überlegen, was passieren soll!
wann soll das System.out.println() erfolgen? doch wohl nicht von der main gesteuert, sondern erst wenn in der GUI agiert wird,
vom Listener aus gesteuert,

der Listener könnte nach Setzen der Daten in der Klasse Tester eine Methode ‘testeJetzt()’ starten, wenn dort dann auf das Frame zugegriffen wird
(kein neu erstelltes, sondern das laufende, das bekannt sein muss als Attribut), dann werden wohl die richtigen Daten gelesen,
oder gar nicht zurück im Frame lesen, die Daten bei ‘testeJetzt()’ als Parameter mit übergeben

von Frame-Sicht aus muss es für den Aufruf in jedem Fall auch erstmal ein erstelltes Tester-Objekt geben (welches evtl. die Frameklasse kennt), noch ein Instanzattribut,
so geht es hin und her, vielleicht viel Code ‘erstelle Object A, B, C/ A du kennst nun B/ B du kennst nun A’ usw.,
erscheint jetzt nach vielen Aufgaben auf einmal, aber das legt sich dann[/QUOTE]

Ahh, danke ja so gehts wohl. Waren auch nur 4 Zeilen die ich ergänzen musste (oder hab ich irgendwas falsch gemacht?). Habe jetzt in der Klasse FrameNochBesser ein Objekt tester erzeugt:
Tester tester = new Tester();
Dann in den Listener den Methodenaufruf:

            
                if (links_rechts == 1){
                data = 137;                                    //10001001
                }else{
                data = 145;                                    //10010001
                }
                tester.testejetzt(data);
                
            }
            });``` 

Und dann noch die Methode in Tester erstellt:
```package testpackage;

public class Tester {
    
    public static void main(String[] args){
        
        FrameNochBesser y = new FrameNochBesser();
    
    }

    public void testejetzt(int data) {
        // TODO Auto-generated method stub
         System.out.println(data);
    }     

}

Das ganze kann ich ja jetzt sicherlich für meine Zwecke nutzen und statt dem testejetzt halt eine Methode benutzen, die den Outputstream erzeugt.

Danke!