Java/Swing/Eventos e Action listeners: diferenças entre revisões

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
He7d3r.bot (discussão | contribs)
Atualizando a categoria do livro, com AutoCat (detalhes). utilizando AWB
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 6:
Para começar, vamos escrever o esqueleto do programa:
 
<sourcesyntaxhighlight lang="java">
// arquivo swing_button_1.java
// inicio do programa swing_button - versao 1.0
Linha 50:
}
// fim do programa swing_button - versao 1
</syntaxhighlight>
</source>
 
O programa acima não faz nada: pode-se clicar no botão, mas isto não tem efeitos. Precisamos incluir dois elementos:
Linha 57:
 
Incluir um ''actionListener'' no botão é muito simples: basta chamar o membro ''addActionListener'', passando como argumento um objeto do tipo ''ActionListener'':
<sourcesyntaxhighlight lang="java">
button1.addActionListener(al);
</syntaxhighlight>
</source>
 
Já a criação do ''actionListener'' é mais complicada. Um ''actionListener'' deve ter um membro ''actionPerformed''; assim, poderíamos ter:
<sourcesyntaxhighlight lang="java">
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Linha 68:
}
};
</syntaxhighlight>
</source>
 
A versão preliminar do código, que ainda não faz aparecer "OK" na caixa de texto, mas faz aparecer "OK" na console, é:
 
<sourcesyntaxhighlight lang="java">
// programa swing_button_1.java
// inicio do programa swing_button - versao 1.1
Linha 126:
}
// fim do programa swing_button - versao 1.1
</syntaxhighlight>
</source>
E aqui a coisa se complica: não dá para simplesmente trocar a variável ''al'' para:
 
<sourcesyntaxhighlight lang="java">
// ActionListener: makes button1 iteract with entry1
ActionListener al = new ActionListener() {
Linha 137:
}
};
</syntaxhighlight>
</source>
porque o compilador dá erro, com uma mensagem incompreensível (''Cannot refer to a non-final variable entry1 inside an inner class defined in a different method'').
 
Linha 149:
Um esboço da reorganização, com o código que mostra os widgets mas não faz nada, seria:
 
<sourcesyntaxhighlight lang="java">
// programa swing_button_2.java
// inicio do programa swing_button - versao 2.0
Linha 200:
}
// fim do programa swing_button - versao 2.0
</syntaxhighlight>
</source>
== Incluindo o ActionListener ==
Linha 206:
 
A forma mais natural de fazer isto é tornar o próprio ''frame'' um ''ActionListener'', o que pode ser feito trocando-se a definição da classe de:
<sourcesyntaxhighlight lang="java">
public class swing_button_2 extends JFrame {
</syntaxhighlight>
</source>
 
para
<sourcesyntaxhighlight lang="java">
public class swing_button_2 extends JFrame implements ActionListener {
</syntaxhighlight>
</source>
 
Então, todos objetos da classe swing_button_2, além dos métodos da classe JFrame, também herdarão os métodos da classe ActionListener, que, no caso, é apenas um: ''actionPerformed''. Este método deve ser escrito:
 
<sourcesyntaxhighlight lang="java">
public void actionPerformed(ActionEvent e) {
entry1.setText("OK");
};
</syntaxhighlight>
</source>
 
Finalmente, o membro ''button1'' do objeto ''frame'' deve se conectar ao objeto ''frame'', de forma que o método ''actionPerformed'' do ''frame'' seja executado quando o botão for clicado. Assim, temos que fazer:
<sourcesyntaxhighlight lang="java">
button1.addActionListener(this);
</syntaxhighlight>
</source>
 
== Código, versão final ==
A versão final do código fica:
 
<sourcesyntaxhighlight lang="java">
// programa swing_button_2.java
// inicio do programa swing_button - versao 2.1
Linha 291:
}
// fim do programa swing_button - versao 2.1
</syntaxhighlight>
</source>