Frage

Ich habe eine JFrame, die eine „Anzeige“ JPanel mit JTextField und einer „Kontrolle“ JPanel mit Schaltflächen enthält, die den Inhalt des Displays JPanel zugreifen soll. Ich glaube, mein Problem ist, verwandtes, wie das Beobachter-Muster zu verwenden, die im Prinzip verstehe ich. Sie müssen die Zuhörer platzieren und Nachrichten zu aktualisieren, aber ich habe keine Ahnung, wo diese zu setzen, wie der Zugriff von einem Panel zum anderen zu bekommen und vielleicht, wenn notwendig, eine „Datenmodell“ Klasse einzuführen. Zum Beispiel möchte ich den Inhalt der JTextField über das Bedienfeld für den Zugriff auf und ich verwende eine anonyme Aktion Hörer wie folgt:

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
War es hilfreich?

Lösung

Sie müssen die Kopplung zwischen diesen Objekten reduzieren.

können Sie haben einen Master-Objekt, das besitzt alle Textfelder und die Taste (die Platten sind irrelevant)

Dann wird eine separete Action innerhalb dieses Master-Objekts (Ich nenne es Vermittler sehen Mediator-Muster)

Diese Aktion Hörer führt eine Methode auf dem Mediator, der wiederum die Werte aus den Textfeldern nehmen und vielleicht ein Transferobjekt erstellen.

Auf diese Weise können die Kopplung zwischen den Platten, Textfelder usw. zu reduzieren und die Kontrolle an einem Ort (der Vermittler) lassen, das heißt, Sie lassen Sie sie nicht kennen einander.

Sie können den Code in dieser Frage einen Blick: https://stackoverflow.com/questions/324554/#324559

Es zeigt diese Konzepte in Code ausgeführt wird.

BTW das Beobachter-Muster bereits in der JTextField, JButton implementiert ist, Action usw. Sie müssen nur die Haken hinzuzufügen.

Ich hoffe, das hilft.

Bearbeiten Dabei seit zwei Antworten in einem.

Dies ist der Code.

class App { // this is the mediator

    // GUI components.
    private JFrame frame;
    private JTextField name;
    private JTextField count;
    private JTextField date;
    // Result is displayed here.
    private JTextArea textArea;

    // Fired by this button.
    private JButton   go;

    private ActionListener actionListener;


    public App(){
        actionListener = new ActionListener(){
            public void actionPerformed( ActionEvent e ){
                okButtonPressed();
            }
        };
    }

    private void okButtonPressed(){
         // template is an object irrelevant to this code.
         template.setData( getData() );
         textArea.setText( template.getTransformedData() );
    }


    public void initialize(){

        frame     = new JFrame("Code challenge v0.1");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        name     = new JTextField();
        count    = new JTextField();
        date     = new JTextField();
        textArea = new JTextArea();
        go       = new JButton("Go");
        go.addActionListener( actionListener ); // prepare the button.

        layoutComponents(); // a lot of panels are created here. Irrelevant.
    }
}

Komplett-Code ausgeführt wird, kann hier abgerufen werden:

Es ist wichtig, Komposition der Vererbung, wenn möglich, zu begünstigen.

Andere Tipps

Es macht den Code sauberer machen, wenn Sie die Modelle in einer Ebene zu erstellen und eine Schicht oder zwei oben hinzufügen, um die Komponenten und Layout zu erstellen. Sicherlich erstrecken sich nicht die Gleichen von JFrame und JPanel.

Sie haben das Bedürfnis, nicht die Zusammensetzung Hierarchie in der Modellschicht zu machen genau das Display anzeigen lassen. Dann ist es nur eine Frage der den Text aus dem Document nehmen und die entsprechende Operation durchgeführt wird.

Okay, perhpas nicht so einfach. Swing-Modelle sind ein wenig chaotisch. Insbesondere Button ist Gehirn beschädigt, und die Controller-Area-Code möglicherweise nicht völlig rein sein.

Wir haben so Erbauer genannt, die die Mutterplatte aus den Kindern bauen. In diesem Builder haben Sie Zugang zu allen Subkomponenten Sie hören müssen und somit gibt jede Logik implementieren kann.

Schließlich ist die Baumeister wird dann wieder die übergeordnete Panel mit der kompletten Logik.

Wenn Sie das übergeordnete Panel haben, es ist wirklich ein Chaos an den Komponenten Kind bekommen und haben sie nichts tun.

Dank. Ich habe eine Datenmodell-Schicht, die irgendwie die Kommunikation zwischen den Platten verarbeitet.

Ich fand auch diesen Link auf Hörer auf JTextField Wert:

Linktext

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top