Atualização usando reflection

9 respostas
L

Galera estou aprendendo java agora e estou com um problema chato que é o seguinte:
Tenho duas classes (Janela e Janelinha) que possuem dois formulários toscos feitos em swing. Gostária que ao clicar no botão da “janelinha” fosse escrito “OK” no “jTextField” do formulário “Janela”. Já tentei de tudo e não consegui. Agradeço por qualquer ajuda. Segue o código:

*Janelinha:

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Janelinha extends javax.swing.JFrame {

public Janelinha() {
    initComponents();
}


// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(195, Short.MAX_VALUE)
            .addComponent(jButton1)
            .addGap(132, 132, 132))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(172, Short.MAX_VALUE)
            .addComponent(jButton1)
            .addGap(105, 105, 105))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    
    
   try {           
     
     
        Class Janelas = Class.forName("telejudiciario.ctrl.Janelas");                   
        Method teste = Janelas.getMethod("teste");
        Method pack = Janelas.getMethod("pack",null);            
        
        teste.invoke(Janelas.newInstance());            
        pack.invoke(Janelas.newInstance());
        
  
        
         
    } catch (Exception ex) {
        System.out.println("ERRO: "+ex);
    }
}                                        


// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
// End of variables declaration

}

*Janelas:

public class Janelas extends javax.swing.JFrame {

/** Creates new form Janelas */
private javax.swing.JLabel jLabel14;

public Janelas() {
    initComponents();
}

// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton1 = new javax.swing.JButton();
    jTextField1 = new javax.swing.JTextField();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(158, 158, 158)
                    .addComponent(jButton1))
                .addGroup(layout.createSequentialGroup()
                    .addGap(64, 64, 64)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE)))
            .addContainerGap(104, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addGap(32, 32, 32)
            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE)
            .addComponent(jButton1)
            .addGap(53, 53, 53))
    );

    pack();
}// </editor-fold>                        

public void teste() //Método chamado acessado pelo objeto Janelinha
{
    initComponents();
    this.jTextField1.setText("oi");
    this.repaint();
    pack();        
    System.out.println("ok");
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
   
    Janelinha jan = new Janelinha();
    jan.setVisible(true);
    jan.toFront();
   
}                                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Janelas().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
// End of variables declaration

}

9 Respostas

mateusprado

Cade a tag “code” ???
Fica dificil ler codigo assim.

L
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Janelinha extends javax.swing.JFrame {



public Janelinha() {
initComponents();
}


// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jButton1 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(195, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(132, 132, 132))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(172, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(105, 105, 105))
);

pack();
}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:


try {


Class Janelas = Class.forName("telejudiciario.ctrl.Janelas");
Method teste = Janelas.getMethod("teste");
Method pack = Janelas.getMethod("pack",null);

teste.invoke(Janelas.newInstance());
pack.invoke(Janelas.newInstance());




} catch (Exception ex) {
System.out.println("ERRO: "+ex);
}
}


// Variables declaration - do not modify
private javax.swing.JButton jButton1;
// End of variables declaration

}
L
public class Janelas extends javax.swing.JFrame {

/** Creates new form Janelas */
private javax.swing.JLabel jLabel14;

public Janelas() {
initComponents();
}

// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jButton1 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jButton1.setText("jButton1");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(158, 158, 15
.addComponent(jButton1))
.addGroup(layout.createSequentialGroup()
.addGap(64, 64, 64)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(104, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(32, 32, 32)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 53, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(53, 53, 53))
);

pack();
}// </editor-fold>

public void teste() //Método chamado acessado pelo objeto Janelinha
{
initComponents();
this.jTextField1.setText("oi");
this.repaint();
pack();
System.out.println("ok");
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

Janelinha jan = new Janelinha();
jan.setVisible(true);
jan.toFront();

}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Janelas().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
// End of variables declaration

}
L

Agora ficou bem melhor, rss… desculpa

Marky.Vasconcelos

Cara… voce tem certeza que Reflection é o melhor caminho? Gosto dessa área mas acho que não é necessario para o que voce quer fazer.

Um método Delegate para o setText do jButton da outra classe é muito mais façil de implementar.

L

Mark_Ameba:
Cara… voce tem certeza que Reflection é o melhor caminho? Gosto dessa área mas acho que não é necessario para o que voce quer fazer.

Um método Delegate para o setText do jButton da outra classe é muito mais façil de implementar.

olá Mark_Ameba, estou aprendendo java agora, não sei se essa é a melhor forma, mas acho que devem existir várias formas inclusive usando uma simples herança, porém nunca implementei delegate em java (se puder postar algum exemplo) de toda forma vou buscar saber mais sobre o assunto, obrigado pela sugestão.

L

O que está pegando é que o método:

public void teste() //Método chamado acessado pelo objeto Janelinha
    {
        initComponents();
        this.jTextField1.setText("oi");
        this.repaint();
        pack();        
        System.out.println("ok");
    }

está sendo acessado, tanto é que aparece o “ok” na console. Já tentei atualizar o objeto de diversas formas, mas mesmo assim nada de funcionar.

Marky.Vasconcelos

Agora que vi… voce não tem nenhuma instancia de janela na classe Janelinha. Voce pode passar um no construtor por exemplo, e invokar o método teste do objeto.

O “ok” aparece no console por que seu método via Reflection cria outra instancia mas não usa o setVisible(true) então a tela não aparece mas mesmo assim o método é chamado e a unica saida que é possivel ver é no console a palavra “ok”.

Pra te ajudar.

Voce pode fazer na classe Janelinha
No lugar de:

public Janelinha() {  
 initComponents();  
 }

Voce pode fazer

private Janela janela;
public Janelinha(Janela janela){
this.janela = janela;
initComponents();
}

E o método…

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
 // TODO add your handling code here:  
   
   
 try {  
   
   
 Class Janelas = Class.forName("telejudiciario.ctrl.Janelas");  
 Method teste = Janelas.getMethod("teste");  
 Method pack = Janelas.getMethod("pack",null);  
   
 teste.invoke(Janelas.newInstance());  
 pack.invoke(Janelas.newInstance());  
   
   
   
   
 } catch (Exception ex) {  
 System.out.println("ERRO: "+ex);  
 }  
 }

Pode ser simplesmente

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
 // TODO add your handling code here:  
janela.teste();
 }

E onde voce instancia essa classe no método da Janela voce passa ela como parametro…
ou seja…
isso:

Janelinha jan = new Janelinha();  
 jan.setVisible(true);  
 jan.toFront();

Vai ser isso:

Janelinha jan = new Janelinha(this);  
 jan.setVisible(true);  
 jan.toFront();

Não se preocupe com Reflection agora. ^^

L

Caro Mark_Ameba , muito obrigado pela atenção e pela ajuda, vou ficar com essa última solução, gostei muito. Espero um dia poder ajudar os colegas tbm. Abraços

Criado 15 de abril de 2009
Ultima resposta 17 de abr. de 2009
Respostas 9
Participantes 3