Passando valores entre Jframes

8 respostas
S

Olá pessoal!

Estou com uma pequena duvida, espero que vocês possam me auxiliar.

Eu tenho 2 jFrames. O primeiro possui um jTexfield e no segundo um jButton.
Eu quero que ao clicar no jbutton do meu segundo jFrame, um texto apareça no jTextfield do primeiro jFrame.

Tentei da seguinte forma...

jFrame1:
public class testea extends javax.swing.JFrame {

    public testea() {
        initComponents();
    }
    
    public void muda(){
        jTextField1.setText("DEU CERTO");
    }
}
jFrame2:
public class Recebe extends javax.swing.JFrame {
    public testea teste;

    public Recebe() {
        initComponents();
    }
    
    public void mudando(){
        teste.muda();
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        mudando();
    } 
}

Mas não funciona ;//

Será que vocês tem alguma ideia de como eu poderia fazer isso??
Desde já obrigado!!

8 Respostas

d34d_d3v1l

Só pelo título do post eu respondo:
por parâmetro :slight_smile:

Agora vou ler e depois resposto se eu estiver mto enganado

PS: tem mto disto aqui no forum, vc poderia ter pesquisado
(calma calma, estou falando só pelo título… agorinha confirmo)

USE A TAG CODE para postar códigos

d34d_d3v1l

É cara, funciona sim…
Mas kdê que vc recebeu a instância do testea na sua JFrame2?

faz assim:

private testea teste;

public jframe2(testea t){
   teste = t;
}

OU ENTÃO faça assim:

private testea teste;

public jframe2(){
   teste = new testea();
   teste.setVisible(true);
}

OU então faça um método estático

public static mudar(){
 jText.setText("OK");
} 

// e faça:
testea.mudar();

mass é meio porco…
melhor opção é a primeira.

Clercio_Guiliche
//Já que vamos usar componentes swing, usamos o importa para encurtar
//os caminhos
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Exemplo {
    /*
     * Esse método serve de porta de entrada para iniciar o programa.
     * É exactamente nesse método que o programa mais começar.
     */
    public static void main(String[]args){
        //Em primeiro temos que criar dos dois JFrames
        //Não precisamos colocar javax.swing.JFrame pq já importamos o
        //caminho no início do programa
        JFrame frame1=new JFrame("Frame 1");
        JFrame frame2=new JFrame("Frame 2");
        
        JButton testar=new JButton("Textar");
        final JTextField testado=new JTextField("Não testado");
        
        //Agora vamos colocar cada coisa no seu lugar
        frame1.setLayout(null);
        frame2.setLayout(null);
        
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        testar.setLocation(10, 10);
        testado.setLocation(10, 10);
        
        testar.setSize(150, 25);
        testado.setSize(150, 25);
        
        frame1.setSize(190, 100);
        frame2.setSize(190, 100);
        
        frame1.add(testar);
        frame2.add(testado);
        
        //Agora, adicionar o action listener
        //Aqui o caminho também foi importado
        testar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                testado.setText("Testado com sucesso !!!");
            }
        });
        
        //Por fim, fazer os Frames aparecerem
        frame1.setVisible(true);
        frame2.setVisible(true);
    }
}
Clercio_Guiliche

Aconselho muito a usar o Netbeans para desenhar as interfaces visualmente porque como já pode notar, desenhar interfaces por código é um pouco complicado.

S

Obrigado pela atenção e desculpa pelos erros é que sou novo aqui no forum :smiley:

Acabou não dando certo a aplicação desses modos que vocês me passaram :confused:

Na verdade eu quero que ao apertar o button que está no jFrame2 o texto apareça la no jtexfield do jframe1.
Eu fiz na interface gráfica. É que postei só uma pequena parte do código, o resto não era necessário pq eu faço vários testes nesse meu projeto aqui, e tem muita coisa misturada junto. Agora estava querendo aprender a fazer isso, mas ainda não obtive sucesso.

Ele sempre fica dando este erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at teste.Recebe$3.actionPerformed(Recebe.java:98) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6505) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6270) at java.awt.Container.processEvent(Container.java:2229) at java.awt.Component.dispatchEventImpl(Component.java:4861) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4687) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) at java.awt.Container.dispatchEventImpl(Container.java:2273) at java.awt.Window.dispatchEventImpl(Window.java:2719) at java.awt.Component.dispatchEvent(Component.java:4687) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703) at java.awt.EventQueue.access$000(EventQueue.java:102) at java.awt.EventQueue$3.run(EventQueue.java:662) at java.awt.EventQueue$3.run(EventQueue.java:660) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) at java.awt.EventQueue$4.run(EventQueue.java:676) at java.awt.EventQueue$4.run(EventQueue.java:674) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:673) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at teste.Recebe$3.actionPerformed(Recebe.java:98) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6505) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6270) at java.awt.Container.processEvent(Container.java:2229) at java.awt.Component.dispatchEventImpl(Component.java:4861) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4687) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) at java.awt.Container.dispatchEventImpl(Container.java:2273) at java.awt.Window.dispatchEventImpl(Window.java:2719) at java.awt.Component.dispatchEvent(Component.java:4687) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703) at java.awt.EventQueue.access$000(EventQueue.java:102) at java.awt.EventQueue$3.run(EventQueue.java:662) at java.awt.EventQueue$3.run(EventQueue.java:660) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) at java.awt.EventQueue$4.run(EventQueue.java:676) at java.awt.EventQueue$4.run(EventQueue.java:674) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:673) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

S

Clercio Guiliche seu exemplo está perfeito!
É exatamente isto que eu quero, porem meus componestes já estão criados.
Como eu aplico este exemplo com componeste já criados?

Eu já tenho os 2 frames e tenho o jTexfield1 no 1° frame e o jbutton no segundo frame.

Fico no aguardo.

ViniGodoy

Repetindo o que o d34d_d3v1l falou:
1. Receba no construtor do JFrame que tem o botão, o frame que deverá ser atualizado. E guarde isso numa propriedade;
2. Crie no frame que será atualizado um método público, que permite a atualização, como setText. Esse método irá alterar o valor do JTextField;
3. No frame do botão, ao clicar no JTextField, chame: frameQueSeraAtualizado.setText("AE! FUNCIONA!");
4. Na hora de criar os JFrames, é necessário passar como parâmetro para o frame do botão o frame que tem a caixa de texto.

Usando suas classes de exemplo:
public class FrameA extends javax.swing.JFrame {

    public FrameA() {
        initComponents();
    }
    
    public void muda(){
        jTextField1.setText("DEU CERTO");
    }
}
public class Recebe extends javax.swing.JFrame {  
        private FrameA teste;  
      
        //Aqui estava faltando receber o outro frame por parâmetro
        public Recebe(FrameA teste) {
            this.teste = teste; 
            initComponents();  
        }  
                
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            teste.muda();  
        }   
    }
E na hora de criar os JFrames, é necessário fazer:
//E será necessário passa-lo por parâmetro também.
FrameA frame1 = new FrameA();
Recebe r = new Recebe(frame1);

Se você quer trocar dados entre janelas, é geralmente muito mais fácil comunicar-se com dialogs modais. Na prática, elas que farão o grosso dessa comunicação no sistema. Comunicação entre frames é incomum, pois ambos os frames podem ser abertos ou fechados a qualquer momento.

S

Ótima as dicas!

Vou continuar aprimorando meus estudos, obrigado pelas atenções dispensadas :smiley:
Creio que conseguirei muito progresso estudando esses exemplos que vocês me passaram.

Não conheço esses dialogs modais, vou pesquisar sobre eles e aplicar exemplos para praticar! :smiley:

Muito obrigado novamente.
Ótimo Forum!

Criado 13 de julho de 2012
Ultima resposta 14 de jul. de 2012
Respostas 8
Participantes 4