Listener com componentes

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

Sim.

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

[quote=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[/quote]

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.

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.

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:

[quote=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[/quote]

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

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

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

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() {
    ...

[quote=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:

[code]
JButton jbt = new JButton();

jbt.addActionListener (new ActionListener() {

[/code][/quote]

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

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

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

[quote=macario1983]
ate o netbeans sugere que pode haver um vazamento de memoria do construtor[/quote]
??? ??? ???

[quote=entanglement][quote=macario1983]
ate o netbeans sugere que pode haver um vazamento de memoria do construtor[/quote]
??? ??? ???

[/quote]

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…