Listener com componentes

12 respostas
M

bom dia

essa semana meu professor mostrou sobre listener e eventos e achei bem legal

estou certo em pensar que é um metodo que age quando acontece determinado evento?

tem como eu criar meu próprio listener atrelado a qualquer evento?

eu estava verificando possibilidad de deixar o codigo menos direcionados ao componentes criados, por exemplo

tenho 3 jTextField

jTextField1
jTextField2
jTextField3

e ai trabalhei usando for nos componentes e cast pelo tipo verificando se é o tipo daquele objeto usando instanceof

e ai vi o seguinte, os panels se tornam dono dos componentes quando colocados?

obrigado

12 Respostas

ViniGodoy

Sim.

Sim. Procure pelo padrão de objetos Observer.
Aqui tem um exemplo:

macario1983:
eu estava verificando possibilidad de deixar o codigo menos direcionados ao componentes criados, por exemplo

tenho 3 jTextField

jTextField1
jTextField2
jTextField3

e ai trabalhei usando for nos componentes e cast pelo tipo verificando se é o tipo daquele objeto usando instanceof

Não entendi nada. Geralmente você não precisar usar instanceof, já que cada componente dispara seu próprio evento e tem seu próprio listener.
O pessoal costuma a fazer uma besteira aqui no GUJ, que é fazer todos os componentes apontarem para o mesmo listener. Isso força o cara a ter que testar a origem do evento, o que é enfadonho, sujeito a erros e desnecessário, se você codificar direito.

Sim.

charles.eduardo

macario1983, me desculpe, porem não consigo explicar suas duvidas.

Mas, encontra-se aqui o link para o tutorial da oracle sobre os listerners, espero que possa contribuir ao seu conhecimento…

http://docs.oracle.com/javase/tutorial/uiswing/events/index.html.

E

Listener (ouvinte) “escuta” o evento, por exemplo o clique em um botão e realiza a ação definida no método actionPerformed.
Não entendi o que quis dizer com componentes criados… Se for referente a usar JPanel, JButton, J… etc. não vai contra umas das ideias da POO de reaproveitar o máximo possível e evitar “reinventar” a roda ?
Quanto a questão do painel se tornar dono do componente criado… não sei se seria essa a definição correta, no entanto é o Gerenciador de Layout do Painel que vai decidir sobre o tamanho e o local dos componentes adicionados a ele, assim como o Gerenciador de Layout da moldura , por exemplo o JFrame , que fica responsável por decidir sobre o tamanho e o local dos componentes adicionados a ele, por exemplo o Painel.

Me desculpe se eu estiver enganado, também sou novato em java, mas como decidi fazer parte da comunidade GUJ por causa das boas respostas e informações passadas pelos outros membros, resolvi também tentar contribuir com o que eu souber. Afinal, também pode ser uma forma de aprender. :stuck_out_tongue:

M

macario1983:
eu estava verificando possibilidad de deixar o codigo menos direcionados ao componentes criados, por exemplo

tenho 3 jTextField

jTextField1
jTextField2
jTextField3

e ai trabalhei usando for nos componentes e cast pelo tipo verificando se é o tipo daquele objeto usando instanceof

Cara seria assim, representando com trecho de codigo

@Override
    public void stateChanged(ChangeEvent e) {
        
        double valorTotal = 0;
        
        for (Component componente : jPanel2.getComponents()) {
            if (componente instanceof JSpinner) {
               double preco = Double.parseDouble(((JSpinner) componente).getToolTipText());
               int quantidade = (Integer) ((JSpinner) componente).getValue();
               valorTotal += (preco * quantidade);
            }
        }
        jLabel13.setText(NumberFormat.getCurrencyInstance().format(valorTotal));
    }
ViniGodoy

Não seria melhor adicionar o listener diretamente no JSpinner?

M

como assim, adicionar diretamente…?
estou vendo aki no material que o pessoal passou um exemplo no site da oracle…

E

Adicionar o listener diretamente em um componente é criar uma classe anônima (que é uma coisa que foi criada pela Sun, atual Oracle, só para isso mesmo - facilitar a codificação de listeners para componentes Swing e AWT).
Algo como:

JButton jbt = new JButton(); 
...

jbt.addActionListener (new ActionListener() {
    ...
M
entanglement:
Adicionar o listener diretamente em um componente é criar uma classe anônima (que é uma coisa que foi criada pela Sun, atual Oracle, só para isso mesmo - facilitar a codificação de listeners para componentes Swing e AWT). Algo como:
JButton jbt = new JButton(); 
...

jbt.addActionListener (new ActionListener() {
    ...

hum...ok

seria criar uma classe a parte...pq do modo que vi o professor fazendo...era direto na mesma classe

ate o netbeans sugere que pode haver um vazamento de memoria do construtor

M

lendo o livro use a cabeça sobre GUI, lá explica melhor o que foi citado acima como melhor forma de se trabalhar com listener

obrigado pela ajuda de todos

E

Eu sei de onde vem esse erro. São alguns professores que aprenderam Java na versão 1.0, quando isso era necessário.

Uma vez que introduziram o recurso de classes anônimas na versão 1.1 (olhe, nesse tempo a Microsoft ainda licenciava o Java da Sun :stuck_out_tongue: ), isso deveria ter sido abolido - ter N componentes sendo tratados no mesmo listener. É realmente confuso.

http://oponet.stsci.edu/web/documentation/Java%20Reference%20Library%201.02/langref/ch01_02.htm

E

macario1983:

ate o netbeans sugere que pode haver um vazamento de memoria do construtor

??? ??? ???

M

entanglement:
macario1983:

ate o netbeans sugere que pode haver um vazamento de memoria do construtor

??? ??? ???

quando eu não criei classes internas, eu chamava no metodo addChangeListener por exemplo apenas por (this);

e o netbeans acusava possivel vazamento

depois q usei inner class nao deu este problema…

Criado 16 de dezembro de 2012
Ultima resposta 26 de dez. de 2012
Respostas 12
Participantes 5