2016-05-22 12 views
0

Ich habe zwei verschiedene und unabhängige JFrame Fenster auszuführen:JFrame für den Datenempfang wartet seine Aufgabe

  1. DataFrame
  2. GraphFrame

Die erste ist für den Benutzer zu manipulieren, mit der Eingabe von verschiedenen Werten und Mustern zur Darstellung in einem Diagramm, dargestellt in 2). Die 1) sendet spezifische Werte an 2) (Array mit Doppel), so dass "GraphFrame" das Diagramm erstellen kann.

Ich rufe die "main" -Methode von GraphFrame in der "Main" -Methode von DataFrame auf, so dass beide gleichzeitig laufen und beide während des gesamten Prozesses sichtbar sind.

Ich möchte, dass diese Rahmen völlig unabhängig sind, was bedeutet, dass die Mission für 1) das Senden von Werten ist und die Aufgabe für 2) darin besteht, zu überprüfen, wann Werte empfangen werden und dann den Graphen zu erstellen.

Ich bevorzuge es auch, die meisten Methoden privat zu halten, so dass sie nicht von externen Quellen zugegriffen werden können.

Mein Problem ist, dass ich nicht weiß, welcher der beste Weg ist, diesen Datenaustausch zu implementieren. Was ist der beste Weg für Frame 2) "Zuhören" für die Werte, die es empfangen muss?

Soll ich Getter/Setter auf 2) und mit Hilfe eines Observer https://sourcemaking.com/design_patterns/observer erstellen?

Oder sollte ich Gewinde verwenden?

oder auch die Schaffung eines traditionellen Schleife, die für Werte wartet immer wieder, wie:

while(array.isEmpty()) { 
    //stuck here 
} 
//create the graph from the values in array 

Im Moment habe ich die Werte in 2) von Setter-Methoden erhalte, aber ich bin unfähig, so weit, den gewünschten Code nur auszuführen, nachdem ich die Werte erhalten habe.

Was denken Sie, ist der beste Weg, dies zu implementieren?

S.S .: Sollte ich erwägen, nicht GraphFrame Haupt von DataFrame aufrufen und diese 2 separat laufen?

+0

Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://StackOverflow.com/q/9554636/418556) –

+0

* "JFrame wartet auf den Datenempfang, um seine Aufgabe zu erfüllen" * Konvertieren Sie ein Bild in ein modaler 'JDialog' oder ein' JOptionPane'. Fragen Sie die Steuerelemente unmittelbar nach 'setVisible (true)' ab. Die auf diesen Aufruf folgenden Codeanweisungen werden erst fortgesetzt, wenn sie geschlossen werden. –

+0

Hallo @AndrewThompson, ich habe diesen Thread schon mehrmals gesehen und gelesen, und ich habe Layouts verwendet, um mehrere JFrames zu vermeiden. Aber für das, was ich erstelle, brauche ich diese 2 (und werde nur 2 sein), weil der "DataFrame" eine reale Umgebung simuliert, also wird es meistens verwendet, um "GraphFrame" zu testen. Es ist in der Tat der Eindruck, dass es zwei verschiedene Apps sind und nicht nur eine. Daher mein P.S. in meinem Thread. – Nhekas

Antwort

1

Von dem, was ich verstanden habe, versuchen Sie, beide JFrames in der gleichen Anwendung auszuführen. Konzeptionell ist dies eher ein UI aufgeteilt in zwei Fenster als unter zwei Frames wie Sie es sagen.

Swing benötigt die Aktualisierung aller UI-Elemente durch einen Thread - das AWT-Thread. Auch die Interaktion mit der Benutzeroberfläche wird im AWT-Thread ausgeführt. Sie müssen dies berücksichtigen.

Es ist auch die beste Vorgehensweise, Datenmodell und Ansicht zu trennen. Um Ihr Problem zu lösen, könnten Sie ein Modell für den GraphFrame erstellen, das durch Änderungen am Datenrahmen manipuliert wird. Diese Änderungen könnten e.G. von einem Listener auf dem Modell abgeholt werden, das SwingUtils.invokeLater() verwendet, um den GraphFrame zu aktualisieren.

Natürlich gibt es eine Reihe von Problemen, die Sie möglicherweise zusätzlich berücksichtigen müssen und je nach Ihren Anforderungen müssen Sie die beiden Teile möglicherweise weiter entkoppeln.

+0

Oh ok. Um die Mission zu erfüllen, voneinander unabhängig zu sein (diese Rahmen), sollte ich sie dann als zwei verschiedene Anwendungen erstellen? Auf diese Weise würden sie völlig getrennt sein. Wie könnte ich die Verbindung zwischen den beiden herstellen? Auf der anderen Seite haben Sie vorgeschlagen, die invokeLater() -Methode, aber ich habe nicht verstanden, wie es wirklich funktioniert (sorry, noch nie zuvor verwendet). – Nhekas

0

Sie könnten versuchen, GraphFrame initialisieren und dann anhalten, aber haben Sie eine (statische/nicht statische) Methode in GraphFrame, die DataFrame aufrufen kann, um das Diagramm zu aktualisieren. Danach zeichne GraphFrame neu.

Ist das wonach Sie suchen?

+0

Das ist in der Tat eine Möglichkeit! Allerdings muss ich eine Option haben, dass das Diagramm in GraphFrame in Echtzeit aktualisiert oder alle 2 oder 3 Sekunden aktualisiert werden muss, um es weiter zu zeichnen (nicht das Ganze vollständig zeichnen). Und damit müsste ich die Grafik alle 2/3 Sekunden aktualisieren, aber ich möchte nur "einen Knopf drücken" (machen Sie eine Aktion) auf DataFrame, und dann kann GraphFrame all dies alleine bewältigen. – Nhekas