Estou aqui me roendo por que não consigo fazer uma coisa no meu programa, vou explicar o que esta acontecendo:
Possuo uma JInternalFrame que tem dois botões: Ligar e outro Desligar.
Eu invoco esse JInternalFrame dentro do JFrame principal do meu projeto, que por este possui uma JLabel chamda status.
O que deveria acontecer é o seguinte, quando eu clicar em Ligar no JInternalFrame, o JLabel do Jframe principal deveria aparecer: Ligado. E se eu clicar em Desligar, aparece desligado.
Como eu faço isso ???
Sinceramente não flui nenhuma ideia na minha cabeça, ja tentei passar por referências mas não da certo também por que o botão esta numa classe e o que eu quero atualizar esta em outra…
A maneira mais boboca de fazer isso é passar uma referência do JFrame para o seu JInternalFrame (a propósito, tenho arrepios quando alguém vai fazer programas com JDesktopPane e JInternalFrame. A probabilidade de dar bagunça é tendendo a 100%).
Uma coisa mais ou menos assim (só para você ter uma idéia: )
classMyFrameextendsJFrame{.........MyInternalFramemif=newMyInternalFrame();mif.setMyFrame(this);.....publicvoidsetStatus(Stringstatus){// digamos que lblStatus seja o JLabel que você deseja atualizarlblStatus.setText(status);}...classMyInternalFrameextendsJInternalFrame{privateMyFramemyFrame;publicvoidsetMyFrame(MyFramemyFrame){this.myFrame=myFrame;}....myFrame.setStatus("Ligar");....
F
felipeaps
Pode criar um observador de eventos no frame principal.
Manda o JInternalFrame se cadastrar no observador e quando aperta o botao dispara um evento pro observador.
Espero ter ajudado, flw!
E
entanglement
Na prática, isso gera uma dependência de MyInternalFrame com a classe MyFrame. Se usar a idéia de “observer” ou “listener”, você pode reduzir esse acoplamento.
Vinicius_Zibetti_Res
Alguem pode me dar um exemplo desse tipo de dependencia ?
E
entanglement
“Dependência” quer dizer que o código da classe MyFrame começa a depender do código de MyinternalFrame e vice-versa. Se usar o conceito de “listener” ou “observer” você pode quebrar essa dependência.
Vinicius_Zibetti_Res
entanglement, eu entendi o que você quis dizer, mas acho que me expressei errado, quando me referi a um exemplo, gostaria que você me passasse um material que me ajudasse neste estudo, eu procurei na internet mas aqui eu não achei algum que me explique bem esse tipo de tratamento, sera que você conhece algum ai que me ajude ?
E
entanglement
Acho mais fácil dar um exemplo. Não vou usar um JInternalFrame porque acho muito complicado usar isso - vou usar apenas um JDialog e um JFrame, para simplificar.
F
felipeaps
Olha um exemplo basicão:
publicclassMyJFrameextendsJFrameimplementsPropertyChangeListener(){privatevoidmontaFrame(){MyInternlFrameinternal=newMyInternalFrame();internal.addPropertyChangeListener(this);}publicvoidpropertyChange(PrpertyChangeEventevt){if(evt.getPrpertyName.equals("internal")){//atualiza o label}}}
Ai na classe do internalFrame, no action do seu botão vc faz:
// Os valores de true, true sao objetos que vc pode utilizar como sendo valores antigos e valor novofirePropertyChange("internal",true,true);
Acho que isso ajuda. Flws
Vinicius_Zibetti_Res
Ok, eu estava querendo usar o JDialog mesmo… xD
Vinicius_Zibetti_Res
felipeaps:
Olha um exemplo basicão:
publicclassMyJFrameextendsJFrameimplementsPropertyChangeListener(){privatevoidmontaFrame(){MyInternlFrameinternal=newMyInternalFrame();internal.addPropertyChangeListener(this);}publicvoidpropertyChange(PrpertyChangeEventevt){if(evt.getPrpertyName.equals("internal")){//atualiza o label}}}
Ai na classe do internalFrame, no action do seu botão vc faz:
// Os valores de true, true sao objetos que vc pode utilizar como sendo valores antigos e valor novofirePropertyChange("internal",true,true);
Acho que isso ajuda. Flws
Ah sim mas como o JFrame principal vai saber que eu cliquei no botao ?
F
felipeaps
O método “firePropertyChange()” que vc vai chamar no action do botão lança um evento.
Então o observador, no caso o Jframe principal, já “escuta” esse evento e aí vc pode fazer o que quiser.
Vinicius_Zibetti_Res
felipeaps, fiz do jeitinho que você falou, no Jframe implementei PropertyChangeListener, sobrescrevi o
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.equals("internal")) {
System.out.println("OK");
}
}
E no Internal coloquei dentro do botao: firePropertyChange(“internal”, true, true);
Mas nada acontece, ou melhor, nao imprime o OK
F
felipeaps
Vinicius Zibetti Resko:
felipeaps, fiz do jeitinho que você falou, no Jframe implementei PropertyChangeListener, sobrescrevi o
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.equals("internal")) {
System.out.println("OK");
}
}
E no Internal coloquei dentro do botao: firePropertyChange(“internal”, true, true);
Mas nada acontece, ou melhor, nao imprime o OK
vc adicionou o listener no seu internalFrame?
internal.addPropertyChangeListener(this)
e arruma isso tb:
if(evt.getPropertyName.equals("internal"))
Vinicius_Zibetti_Res
Arrumei:
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("internal")) {
Main.jLSinchronism.setIcon(new ImageIcon("src//images//on.png"));
System.out.println("OK");
}
}
internal.addPropertyChangeListener(this), ja estava OK, mas nao funciona ainda.
Vinicius_Zibetti_Res
Ah funcionou perfeitamente agora, ja vi o erro, tenho que setar assim olha:
firePropertyChange(“internal”, false, true);