Pregunta

Tengo un JFrame que contiene una " pantalla " JPanel con JTextField y un " control " JPanel con botones que deben acceder al contenido de la pantalla JPanel . Creo que mi problema está relacionado con cómo usar el patrón de observador, que en principio entiendo. Debe ubicar a los oyentes y actualizar los mensajes, pero no tengo ni idea de dónde colocarlos, cómo obtener acceso de un panel al otro y tal vez, si es necesario, introducir un "modelo de datos". clase. Por ejemplo, quiero acceder al contenido del JTextField desde el panel de control y uso un detector de acciones anónimo de la siguiente manera:

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
¿Fue útil?

Solución

Necesita reducir el acoplamiento entre estos objetos.

Puede tener un objeto maestro que posea todos los campos de texto y el botón (los paneles son irrelevantes)

Luego un separador de acción separado dentro de ese objeto maestro (lo llamo mediador ver patrón de mediador)

Ese oyente de acción realiza un método en el mediador que a su vez toma los valores de los campos de texto y crea quizás un objeto de transferencia.

De esta manera, reduce el acoplamiento entre los paneles, los campos de texto, etc. y deja el control en un lugar (el mediador), es decir, no les permite conocerse entre sí.

Puedes echar un vistazo al código en esta pregunta: https://stackoverflow.com/questions/324554/#324559

Muestra estos conceptos al ejecutar código.

Por cierto, el patrón de observador ya está implementado en JTextField, JButton, ActionListener, etc. Solo necesita agregar los ganchos.

Espero que esto ayude.

EDITAR unió dos respuestas en una.

Este es el código.

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.
    }
}

El código completo y en ejecución se puede recuperar aquí:

Es importante favorecer la composición sobre la herencia cuando sea posible.

Otros consejos

Limpia el código si crea los modelos en una capa y agrega una o dos capas arriba para crear los componentes y el diseño. Ciertamente no extienda los gustos de JFrame y JPanel .

No sienta la necesidad de hacer que la jerarquía de composición en la capa del modelo coincida exactamente con la pantalla. Entonces es solo cuestión de tomar el texto del Documento y realizar la operación relevante.

Bien, perhpas no es tan simple. Los modelos de swing son un poco desordenados. En particular, ButtonModel tiene daños cerebrales y el área de código del controlador puede no ser completamente pura.

Tenemos los llamados constructores, que construirán el panel principal a partir de los hijos. En este generador, tendrá acceso a todos los subcomponentes que necesita escuchar y, por lo tanto, puede implementar cualquier lógica allí.

Finalmente, el generador devolverá el panel principal con la lógica completa.

Una vez que tienes el panel principal, es realmente un desastre llegar a los componentes secundarios y hacer que hagan cualquier cosa.

gracias. Agregué una capa de modelo de datos que maneja de alguna manera la comunicación entre los paneles.

También encontré este enlace útil en Listeners en JTextField:

texto del enlace

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top