Come gestire il flusso di dati tra i componenti dell'interfaccia utente?

1

Ho cercato di utilizzare classi che implementano ActionListener per rispondere all'input dell'utente. Sto costantemente notando che per un listener di azioni per comunicare l'evento ad altri oggetti, deve contenere l'oggetto. Mi piace,

L'oggetto che voglio aggiornare quando viene fatto clic su action_src:

public class Display_Field {
    JTextField display;

    public Display_Field ( JButton action_src ) {
        action_src.addActionListener( new Open_Dialog_Click( this ) );
    }

    public void setText( String text ) {
        display.setText( text );
    }
}

L'ActionListener che ho intenzione di aggiungere a action_src:

public class Open_Dialog_Click implements ActionListener {
    private Display_Field display;

    public void actionPerformed( ActionEvent action ) {
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog( null );
        display.setText( chooser.getSelectedFile().getName() );
    }

    public Open_Dialog_Click( Display_Field display ) {
        this.display = display;
    }
}

Ci sono così tante convoluzioni! Come, il display deve essere costruito con un pulsante che aggiunge un ActionListener che deve essere costruito con lo schermo ...

Esiste un modo meno complesso per consentire il flusso di dati tra i componenti?

Ho preso in considerazione l'idea di creare una classe centrale che ospita tutti gli ascoltatori, fungendo da collegamento per qualsiasi comunicazione intercomponente, ma sembra che la classe stia facendo troppo per il suo bene. ... o è così che si fa dopotutto?

    
posta user2738698 02.04.2014 - 23:43
fonte

2 risposte

1

Is there a less convoluted way to allow data to flow between components?

Sì. Si chiama un modello. In un modello / vista / modello di controller (MVC), un'istanza del modello viene passato alla vista in modo che i valori nel modello possano essere letti dalla vista. I valori nel modello sono aggiornati per classi di controller.

In un'applicazione Java Swing, generalmente ci sono molte classi di controller, ciascuna responsabile di una parte della vista.

Dai un'occhiata al mio articolo di John Conway su Game of Life in Java Swing , per vedere come semplice applicazione Java Swing utilizza il pattern MVC.

    
risposta data 30.12.2014 - 22:33
fonte
-1

Quello che faccio normalmente è un JPanel che contiene un riferimento a tutti gli elementi coinvolti. Questo JPanel implementa ActionListener in modo che tu possa passare "questo" a ogni elemento (JTextField, JButton, ecc.) Che crei.

In questo modo puoi accedere a tutti gli oggetti (sono variabili di istanza) e ascoltare tutti gli eventi all'interno della stessa classe.

Se le cose diventano troppo disordinate, ActionListener potrebbe essere una classe esterna (un "controller") che potrebbe contenere un riferimento a più di un JPanel.

Alcuni codici:

public class TestJPanel implements ActionListener
{
    private JButton button;
    private JTextArea textArea;
    private JCheckBox checkBox;

    public TestJPanel() {
        button = new JButton("I'm a button");
        button.addActionListener(this);

        checkBox = new JCheckBox();
        checkBox.addActionListener(this);

        textArea = new JTextArea();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button)
        {
            textArea.setText("Button clicked");
        }
        else if (e.getSource() == checkBox)
        {
            textArea.setText("Checkbox clicked");
        }
    }
}
    
risposta data 01.09.2014 - 21:34
fonte

Leggi altre domande sui tag