2016-05-20 4 views
0

Ich habe einen JFrame namens User, in dem ich eine Variable namens id deklariere und sie auf einen bestimmten Wert setze, abhängig von einigen Bedingungen.Übergeben der in einem Jframe gesetzten Variablen von einem zum anderen

Ich muss diese Variable in einem zweiten JFrame namens Ausgabe verwenden.

Dies ist der Code, den ich

class InputScreen extends javax.swing.JFrame { 
public int id = 0; 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id = 1; 
     System.out.println(id); 
    } 
    elseif (condition){ 
      id = 2; 
      System.out.println(id); 
    } 
    elseif (condition){ 
      id = 3; 
      System.out.println(id); 
    } 
    else{ 
    System.exit(0); 
    } 

habe ich einen Konstruktor im Rahmen Output verwendet, aber es scheint nicht zu funktionieren.

public class Output extends javax.swing.JFrame { 
int rule; 

public Output(int Id){ 
    rule = Id; 
    initComponents(); 
} 

public Output() { 
    initComponents(); 
    conn = MySqlConnect.ConnectDB(); 
} 

Aktualisiert-Code Frame - Eingang

class InputScreen extends javax.swing.JFrame { 
public int id = 0; 

public int getID(){ 
    return input_rule_id; 
} 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id = 1; 
     System.out.println(id); 
    } 
    elseif (condition){ 
      id = 2; 
      System.out.println(id); 
    } 
    elseif (condition){ 
      id = 3; 
      System.out.println(id); 
    } 

Form - Ausgabe

private void formWindowActivated(java.awt.event.WindowEvent evt)  {          

    Input InSc = new Input(); 
    InSc.getId(); 

} 
+1

1) Um eine bessere Hilfe zu erhalten, veröffentlichen Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://stackoverflow.com/q/9554636/418556) –

+0

** Probable ** Duplikat von [Übertragung von Text von einem JFrame zu einem anderen] (http : //stackoverflow.com/q/37336756/418556) .. –

Antwort

1

Alle primitive Datentypen werden durch den Wert übergeben werden. Verwenden Sie einen Objektwrapper, um den Wert an die Referenz zu übergeben. Zum Beispiel AtomicInteger

class InputScreen extends javax.swing.JFrame { 
    private AtomicInteger id = new AtomicInteger(0); 

private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    if (condition){ 
     id.set(1); 
     System.out.println(id); 
    } 
    else if (condition){ 
      id.set(2); 
      System.out.println(id); 
    } 
    else if (condition){ 
      id.set(3); 
      System.out.println(id); 
    } 
     else{ 
     System.exit(0); 
    } 
} 

public class Output extends javax.swing.JFrame { 
AtomicInteger rule; 

public Output(AtomicInteger Id){ 
    rule = Id; 
    initComponents(); 
} 

public Output() { 
    initComponents(); 
    conn = MySqlConnect.ConnectDB(); 
} 
} 
+0

Ich versuchte dieses, aber ich scheine nur Null als der Wert im Ausgangsrahmen zu erhalten. –

+0

Ich kann Ihnen nicht helfen, ohne Ihren vollständigen Code zu sehen. –

+0

Ich habe den Code jetzt aktualisiert. Bitte sehen Sie, ob Sie mir helfen, dies zu klären. –

0

Sie können Getter und Setter verwenden. Definieren Sie eine Getter-Methode in Ihrem Frame, von der aus Sie die ID-Variable übergeben möchten. zB

In Ihrem anderen Frame können Sie einfach diese Methode verwenden, um das Ergebnis zurückzugeben. int id = getID();

Eine weitere Arbeit für dieses Problem besteht darin, die Variable Globus und statisch zu machen, so dass es in den anderen Rahmen importiert und verwendet werden kann.

1

Parameterübergabe Der einfachste Weg wäre Output als Parameter an InputScreen werden vorbei. Dann können Sie einfach eine Methode Output.setId (id) innerhalb Ihrer InputScreen.submitButtonActionPerformed() Logik aufrufen. Dieser Weg ist jedoch ein wenig problematisch, wenn die Anwendung wächst.

Observer-Muster Eine bessere Möglichkeit wäre eine IdChangedListener als Teil eines Beobachter-Muster als Proxy für die Action werden Realisieren Sie bereits implementiert haben. Wenn Ihr ActionListener ausgelöst wird, rufen Sie alle IDChangeListeners, die als Observer registriert sind, InputScreen. In Ausgabe stellen Sie eine Methode setId (id) zur Verfügung, um Zugriff bereitzustellen. An der Stelle, an der Sie die beiden JFrames instanziieren, implementieren Sie einen IdChangeListener, fügen Sie ihn zu InputScreen hinzu, und wenn es ausgelöst wird, rufen Sie Output.setId() auf.

Wie auch immer, Sie sehen eine Menge Arbeit (und Code) für nur ein Ereignis. Auch dieser Ansatz hat seine Grenzen hinsichtlich der Anwendungsgröße und der Dynamik.

Im Speicher EventBus Der aktuelle Ansatz wäre ein im Speicher EventBus verwenden. Dies beseitigt die hard-wire Verdrahtung der Komponenten innerhalb Ihrer Benutzeroberfläche und reduziert die Codegröße. Es beschränkt jedoch die Wiederverwendung von Komponenten, da sie automatisch auf bestimmte Ereignisse reagieren. Was, wenn Sie sie mehr als einmal haben? Verschiedene Events anhören?

Sie müssen überlegen, wo Sie welchen Ansatz verwenden möchten. Ich würde vorschlagen, einen EventBus für die Ereignisübertragung zwischen den konkreten Komponenten Ihrer Anwendung zu verwenden. Verwenden Sie das Observer-Muster für Komponenten mittlerer Größe, während Sie die Parameterübergabe für kleine oder sehr statische Komponenten verwenden.