Olá galera, esse é meu primeiro post, sempre busco infomações nesse fórum, pois acho que é o melhor forum de Java.
Bom, se puderem me ajudar ficarei grato.
Seguinte: tenho uma classe que estende o Jpanel com vários JToggleButton.
Adicionei essa classe em um Jframe.
Problema: como chamar um método no Jframe quando um JTogglebutton for pressionado da classe que estende o JPanel.
Voce pode criar o JPanel no proprio JFrame ou aplicar o Mediator Pattern.
Nossa, me impressionei agora. Postei ontem e jah tem duas respostas. Andava perdendo tempo no google, hehe.
Luiz, você entendeu certinho. Muito obrigado pela dica, com certeza vai funcionar.
Quanto a idéia do heatcold, eu tinha pensado nisso tb, em colocar o painel junto do frame, mas naum queria fazer isso. Acho mais elegante trabalhar em classes distintas, sem contar a idéia de reuso. Não conheço ainda o que é Mediator Pattern, mas vou pesquisar. Como eu preciso disso pra ontem, vou aplicar a idéia do Luiz mesmo.
Só mais uma dúvida: Eu tinha tentado passar meu frame como parametro para o construtor do painel. E entaum chamar um metodo do frame dentro do evento do botaum que esta no painel. Mas deu um erro de iner class oualgo assim, alguém sabe me explicar porque?
No mais muito agradecido, esta solução será aplicada no meu TCC, que é uma ferramenta para gerar graficos tridimensionais de funções matemáticas.
Velho blz !!!
Estou desenvolvendo uma aplicação standalone . . .
Estou pretendendo utilizar o padrão MVC . . .
Será que com essa abordagem eu consigo aplicar esse padrão ???
Depois de ler o que vc falow nos tópicos anteriores . . .
Pensei em criar para cada classe da View (Swing) uma classe correspondente
no Controller (que seria ações realizadas através dos ouvintes dessa classe).
Por exemplo eu criaria uma classe Controllerprincipal.java, Viewprincipal.java e Modelprincipal.java . . .
Na classe Controllerprincipal eu trataria todas as ações(eventos) do usuário atraves da GUI (Viewprincipal) e
tb realizaria todas as operações sobre o BD.
Se houver como vc me da 1 help aí . . .
Flws…
“Deixe-me eu ver se eu te entendi a ti mesmo”:
Você quer criar uma Janela que contenha um painel vindo de uma subclasse de JPanel, e esse painel tem vários JToggleButton. Sua intenção é chamar métodos da janela quando o usuário clicar num dos botões.
Pelo que eu entendi você está tratando os eventos gerados pelos tais cliques dentro da própria classe que contém os botões - no caso, a subclasse de JPanel. E como esse painel é adicionado à JFrame, ele não enxerga o que há nela, nem pode chamar métodos nela.
Se for esse o caso, alegre-se! A solução está hà 2 passos de você!
A meu ver, o problema está justamente no fato de que a própria classe onde o evento é gerado trata esse evento. Assim, ela nunca vai poder interagir com objetos “de fora” dela. O que o pessoal costuma fazer é criar uma classe separada (uma ou mais, depende da tua estratégia) só para “ouvir” os eventos (cliques,
apertar de teclas, etc). Chamam essa classe de “tratador de eventos”. Vou dar um exemplo simples.
Sublcasse de JPanel:
public class MeuPainel extends JPanel{
private JButton b;
//um dos construtores poderia ser assim:
public MeuPainel(ActionListener ac){
this.b=new JButton("Clique aqui");
b.setAlgumaCoisa(algumValor);
//o pulo do gato
b.addActionListener(ac);
outroComponenteQualquer.addActionListener(ac);
umTerceiroComponenteQueEuTambemOmitiAqui.addActionListener(ac);
}
public JButton getBotao(){
if(b==null) b=new JButton("Instancie MeuPainel primeiro!");
return b;
}
}
Janela Principal
public class MinhaJanela extends JFrame{
private MeuPainel mp;
//um dos construtores poderia ser assim:
public MinhaJanela(ActionListener aL){
this.setTitle("Paranguaripotiribicuarum");
this.setSize(480,320);
//envia actionListener para construtor do painel:
mp = new MeuPainel(aL);
//prega o painel na janela:
getContentPane().add(mp);
}
public MeuPainel getMeuPainel(){
if(this.mp == null)
mp=new MeuPainel(null);
return mp;
}
}
E a classe genericamente conhecida como Tratador de Eventos:
//note o implements
class Ouvinte implements ActionListener{
private MinhaJanela mjan;
public Ouvinte (){
/*outro pulo do gato: como Ouvinte implementa ActionListener, envie uma referência dele ao construtor*/
this.mjan=new MinhaJanela(this);
}
//metodo obrigatorio para "implementadores" de ActionListener
public void actionPerformed(ActionEvent e){
if( e.getSource()==mjan.getMeuPainel().getBotao() ){
//um metodo de JFrame é chamado
mjan.setTitle("Clicou! Clicou! Clicou!");
}
}
public MinhaJanela getJanelaPrincipal(){
return this.mjan;
}
}
E o metodo main? Ele costuma ficar em uma outra classe, mas você pode colocá-lo dentro do tratador de eventos, mesmo. De qualquer forma, ele ficaria assim:
public static void main(String abc[]){
Ouvinte trat = new Ouvinte();//a janela é criada dentro do tratador
trat.getJanelaPrincipal().setVisible(true);//a janela aparece
}
Entendeu? O truque é ter uma terceira classe envolvida no negócio. Essa terceira classe deve conhecer a tua janela, conhecer o teu painel e deve também ouvir eventos dos botões. Assim você usa um só tratador para ouvir os eventos de todos os componentes, e a interatividade entre os diferentes objetos de interface gráfica fica bem maior!
Talvez apareça alguém dizendo que é exagero ou que não é a maneira mais “ortodoxa” de fazer, mas sempre criei minhas janelas assim e sempre funcionou.
Boa sorte. Se eu tiver me enganado, me dá um toque.
Como você fez? Cita o código.