Pergunta

Eu tenho um JFrame que contém um JPanel "display" com JTextField e uma JPanel "controle" com botões que devem acessar o conteúdo do JPanel display. Acho que meu problema está relacionado sobre como usar o padrão de observador, que, em princípio, eu entendo. Você precisa ouvintes lugar e mensagens de actualização, mas eu não tenho a menor idéia onde colocar estes, como obter acesso de um painel para o outro e talvez se necessário introduzir uma "datamodel" classe. Por exemplo, eu quero acessar o conteúdo do JTextField do painel de controle e eu usar um ouvinte de ação anônimo da seguinte forma:

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

Solução

Você precisa reduzir o acoplamento entre esses objetos.

Você pode ter um objeto principal, que possui todos os campos de texto e o botão (os painéis são irrelevantes)

Em seguida, um ActionListener separete dentro desse objeto master (Eu chamo-lhe Mediator ver mediador)

Essa ação ouvinte executa um método no mediador que por sua vez assumir os valores dos campos de texto e criar, talvez, um objeto de transferência.

Desta forma, você reduzir o acoplamento entre os painéis, textfields etc. e deixe o controle em um lugar (o mediador), que é, você não deixe que eles se conhecem.

Você pode dar uma olhada no código nesta questão: https://stackoverflow.com/questions/324554/#324559

Ele mostra esses conceitos em execução de código.

Entre o observador padrão já está implementado no JTextField, JButton, ActionListener etc. Você só precisa adicionar os ganchos.

Espero que isso ajude.

Editar Cadastrado duas respostas em um.

Este é o 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.
    }
}

completa e execução de código pode ser recuperada aqui:

É importante favorecer composição sobre herança, quando possível.

Outras dicas

Ele faz o código mais limpo se você criar os modelos em uma camada e adicionar uma camada ou dois acima para criar os componentes e layout. Certamente não se estendem os gostos de JFrame e JPanel.

Não sinto a necessidade de fazer a hierarquia composição na camada de modelo corresponder exatamente ao display. Então é só uma questão de tomar o texto da Document e realizando a operação em questão.

Ok, perhpas não é tão simples. modelos Swing são um pouco confuso pouco. Em particular ButtonModel é o cérebro danificado, ea área de controle de código pode não ser totalmente puro.

Temos chamado construtores, que irá construir painel pai fora das crianças. Neste construtor, você terá acesso a todos os subcomponentes que você precisa para ouvir e pode, portanto, pode implementar qualquer lógica lá.

Finalmente, o construtor irá, em seguida, retornar o painel de pai com a lógica completa.

Assim que tiver o painel pai é realmente uma bagunça chegar aos componentes filhos e tê-los fazer nada.

graças. I adicionou-se uma camada que datamodel alças de alguma forma a comunicação entre os painéis.

Eu também encontrei este link sobre os ouvintes em JTextField útil:

texto do link

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top