essas sao as famosas “anonymous inner class” e, para evita-las, vc pode ou criar classes nomeadas (??) ou fazer a sua classe implementar o ActionListener e usar addActionListener (this).
a mesma coisa que vc colocou na sua anonymous inner class…
tome cuidado que se um objeto for registrado como EventListener de vários componentes, vc deve ver qual o componente que fez a acao e tomar a atitude certa…
soh uma coisa: pq q vc nao quer usar os $1, $2, etc?
[quote=diogormelo][quote=takeshi10]a mesma coisa que vc colocou na sua anonymous inner class…
tome cuidado que se um objeto for registrado como EventListener de vários componentes, vc deve ver qual o componente que fez a acao e tomar a atitude certa…
soh uma coisa: pq q vc nao quer usar os $1, $2, etc?[/quote]
Se eu for usar os $1, $2, etc vai gerar mais de $50, se tem como evitar, fica melhor…
Eu procurei na net em como fazer esse esquema mas não consegui.
Se eu usar a mesma coisa do anonymous inner class, ele aparece direto, sem nem preicsar clicar no jButton.[/quote]
qual esquema q vc procurou na net? e o qq aparece direto sem precisar clicar no jButton?
eu sugeri a vc implementar o ActionListener no seu frame (ou ainda em qualquer outra classe)
dentro do metodo, vc deve verificar o evento e reagir de acordo…
Dá uma olhada…
[code]
import java.awt.;
import java.awt.event.;
import javax.swing.*;
public class SeuFrame extends JFrame implements ActionListener {
private JButton btn1;
private JButton btn2;
public SeuFrame() {
super( "Olá!" );
setLayout( new FlowLayout() );
btn1 = new JButton( "Botão 1" );
btn2 = new JButton( "Botão 2" );
btn1.addActionListener( this );
btn2.addActionListener( this );
add( btn1 );
add( btn2 );
}
public void actionPerformed( ActionEvent e ) {
// verificando qual botão gerou o evento...
if ( e.getSource() == btn1 ) {
// código p/ tratar o btn1
} else if ( e.getSource() == btn2 ) {
// código p/ tratar o btn2
}
.
.
.
.
}
}[/code]
Entendeu agora? Use o método getSource() de ActionEvent para verificar o componente que gerou o evento.
Falow!
Pessoal, dentro de um jDesktopPane tem um jButton, esse jButton tem a ação de abrir (dentro do jDesktopPane) um jInternalFrame chamado Cadastro. Tá funcioanando normal, só que eu tenho vários casos como este na minha aplicação, e o “problema” é que quando eu compilo ele gera o nome da minha aplição + $1 e assim por diante, por exemplo, se eu criar 3 jButtons como abaixo, ele vai gerar MinhaAplicacao$1.class MinhaAplicacao$2.class MinhaAplicacao$3.class além da MinhaAplicacao.class
Como eu posso fazer essas ações nesses jButtons sem ter que gerar um .class para cada um?
jButton.addActionListener(
new ActionListener(){
public void actionPerformed (ActionEvent e)
{
frameCadastro = new cadCFrel();
jDesktopPane.add(frameCadastro);
frameCadastro.setVisible(true);
}
Valeu
Pronto! Minha aplicação já está implementando o ActionListener e o jButton já está como jButton.addActionListener(this); mas… o que eu coloco no
[code]public void actionPerformed(ActionEvent arg0) {
}
[/code]
pra quando eu clicar no jButton ele abrir a jInternalFrame?
Muito obrigado
[quote=takeshi10]a mesma coisa que vc colocou na sua anonymous inner class…
tome cuidado que se um objeto for registrado como EventListener de vários componentes, vc deve ver qual o componente que fez a acao e tomar a atitude certa…
soh uma coisa: pq q vc nao quer usar os $1, $2, etc?[/quote]
Se eu for usar os $1, $2, etc vai gerar mais de $50, se tem como evitar, fica melhor…
Eu procurei na net em como fazer esse esquema mas não consegui.
Se eu usar a mesma coisa do anonymous inner class, ele aparece direto, sem nem preicsar clicar no jButton.
Então… eu coloquei o jButton.addActionListener(this) e as ações que eu estava usando no jButton antes dentro da
public void actionPerformed(ActionEvent arg0) {
…
}
Mas quando eu fiz isso, o jInternalFrame já aparece direto na tela, sem precisar chamar através do jButton
Esse é o problema, eu sou bem leigo em java ainda…
Não sei como fazer isso, desculpe a ignorância, mas se puder dar uma força, eu agradeço
valeu pela resposta davidbuzatto
Essa parte não tem problema. Estou com problemas aqui:
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if ( e.getSource() == jButton ) {
frameCadastro = new cadCFrel();
jDesktopPane.add(frameCadastro);
frameCadastro.setVisible(true);
frameCadastro.show();
}
}
O jInternalFrame já aparece na tela sem precisar clicar no jButton
Dentro de um Applet tenho um jMenuBar(com alguns jMenuItem’s) e um jDesktopPane(com alguns jButton’s). Os jMenuItem’s tem a função de, quando clicados, abrir seu respectivo jInternalFrame(do pacote "cadastro’) que já está criado, assim como os jButtons que estão no jDesktopPane.
Para cada jMenuItem eu fiz o seguinte:
private JMenuItem getJMenuItem() {
if (jMenuItem == null) {
jMenuItem = new JMenuItem();
jMenuItem.setText("Relação");
jMenuItem.addActionListener(
new ActionListener(){
public void actionPerformed (ActionEvent e)
{
frameCadastro = new cadCFrel();
jDesktopPane.add(frameCadastro);
frameCadastro.setVisible(true);
frameCadastro.show();
}
}
);
}
return jMenuItem;
}
Assim funciona, mas o problema é que são vários jMenuItem’s e jButton’s, e para cada um deles a compilação gera o nome da minha classe com “$+número_sequencial”, por exemplo, para o jMenuItem1 ele gera MinhaAplicacao$1.class e assim por diante…
Eu Tentei usar:
...
import cadastro.cadCFrel;
public class index extends Applet implements ActionListener {
...
private cadCFrel frameCadastro;
...
//jMenuItem
private JMenuItem getJMenuItem() {
if (jMenuItem == null) {
jMenuItem = new JMenuItem();
jMenuItem.setText("Relação");
jMenuItem.addActionListener(this);
}
return jMenuItem;
}
//Ação
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if ( e.getSource() == jButton ) {
frameCadastro = new cadCFrel();
jDesktopPane.add(frameCadastro);
frameCadastro.setVisible(true);
}
}
Fazendo isso, o frame é criado automaticamente(frameCadastro = new cadCFrel()), sem precisar clicar no jMenuItem.
Estou utilizando o Eclipse com Visual Editor.
Desde já agradeço pela ajuda.
Acho que descobri… Tenho que criar uma única classe para abrir o respectivo jInternalFrame. Nesse exemplo que fiz, ele só abre o jInternalFrame chamado cadCFrel
private cadCFrel getFrameCadastro() {
if (frameCadastro == null) {
frameCadastro = new cadCFrel();
frameCadastro.setVisible(false);
frameCadastro.enable(false);
}
return frameCadastro;
}
Só que com isso, ele só vai abir o jInternalFrame cadCFrel.
Como eu faço para uma só classe abrir o respectivo jInternalFrame?