Alterar estado de uma Jlabel [Resolvido]

17 respostas
Vinicius_Zibetti_Res

Olá pessoal, boa tarde.

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…

Obriagdo.

17 Respostas

E

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: )

class MyFrame extends JFrame {
    .....
    ....  MyInternalFrame mif = new MyInternalFrame();
          mif.setMyFrame (this);
    .....
    public void setStatus (String status) {
        // digamos que lblStatus seja o JLabel que você deseja atualizar
        lblStatus.setText (status); 
    }
...
class MyInternalFrame extends JInternalFrame {
     private MyFrame myFrame;
     public void setMyFrame (MyFrame myFrame) { this.myFrame = myFrame; }
     ....
     myFrame.setStatus ("Ligar");
     ....
F

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

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

“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

Acho mais fácil dar um exemplo. Não vou usar um JInternalFrame porque acho muito complicado usar isso :slight_smile: - vou usar apenas um JDialog e um JFrame, para simplificar.

F

Olha um exemplo basicão:

public class MyJFrame extends JFrame implements PropertyChangeListener() {

  private void montaFrame() {
    MyInternlFrame internal = new MyInternalFrame();
    internal.addPropertyChangeListener(this);
  }

  public void propertyChange(PrpertyChangeEvent evt) {
    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 novo
firePropertyChange("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:

public class MyJFrame extends JFrame implements PropertyChangeListener() {

  private void montaFrame() {
    MyInternlFrame internal = new MyInternalFrame();
    internal.addPropertyChangeListener(this);
  }

  public void propertyChange(PrpertyChangeEvent evt) {
    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 novo
firePropertyChange("internal", true, true);

Acho que isso ajuda. Flws

Ah sim mas como o JFrame principal vai saber que eu cliquei no botao ?

F

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

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);

F

Ahh, nussa, malz, escrevi errado haha

Ivan_Alves

Tente o seguinte em vez disso:

firePropertyChange("internal", true, true);

Altere para isso:

firePropertyChange("internal", false, true);

Agora q vi que tinha resolvido, flw!

Criado 27 de março de 2012
Ultima resposta 27 de mar. de 2012
Respostas 17
Participantes 4