Como acessar vários JPanels dentro JFrame?
-
11-07-2019 - |
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();
}
});
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: