Retornar valor de método em outra classe

Pessoal estou com um simples problema aqui que creio que algum de vcs irá resolver rapidinho pra mim, é muito simples.

Fiz uma simples aplicação com swing na qual existe um JForm e dentro dele dois JPanel’s, o que eu quero fazer é o seguinte: que um JLabel em uma das JPanel’s pegue a string inserida em um JTextfield no outro JPanel.

No mesmo JPanel do JTextfield criei um botão que no seu ActionListener pede pra ser executado um método do JPanel no qual esta o JLabel, este método setta a string no JLabel por meio de um método no JPanel do JTextfiel, está meio complicado mas sei que vcs conseguem muito bem entender!

Porem este valor não esta sendo inserido, então fiz um teste, ao invés de settar o valor no JLabel escrevi o método pra imprimir algo no console, e ele imprimiu bem, logo percebi que o problema não esta na ação do botão ou no metodo que coloca a string no JLabel mas sim no retorno da string pelo outro método.

Postarei os códigos a seguir:

Classe Main

public class mainClass 
{
	public mainClass() 
	{
		mainForm mf = new mainForm();
	}
	
	public static void main(String[] args) 
	{
		mainClass mClass = new mainClass();
	}
}

Classe do JForm


import java.awt.BorderLayout;

import javax.swing.JFrame;


public class mainForm extends JFrame
{
	Panel_1 p1;
	Panel_2 p2;
	
	public mainForm() 
	{
		super("Main Frame");
		
		p1 = new Panel_1();
		p2 = new Panel_2();
		
		add(p1, BorderLayout.NORTH);
		add(p2, BorderLayout.CENTER);
		
		setSize(600, 400);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setVisible(true);
	}
}

Classe do JPanel em que está o JTextfield


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Panel_1 extends JPanel implements ActionListener, FocusListener
{
	
	private JTextField cxTexto_1 = new JTextField();
	private JButton btSend = new JButton("Send Text");
	private JButton btClear = new JButton("Clear");
	
	Panel_2 p2;
		
	public Panel_1()
	{
		
		btClear.addActionListener(this);
		btSend.addActionListener(this);
		cxTexto_1.addFocusListener(this);
		
		add(cxTexto_1);
		add(btSend);
		add(btClear);
		
		setBorder(BorderFactory.createTitledBorder("Components Panel"));
		setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
				
		setVisible(true);
	}

	public String sendText()
	{
		return cxTexto_1.getText();
	}
	
	@Override
	public void actionPerformed(ActionEvent ev) 
	{
		p2 = new Panel_2();
		
		if(ev.getSource() == btClear)
		{
			cxTexto_1.setText("");
		}
		
		if(ev.getSource() == btSend)
		{
			p2.alterText();
		}
		
	}

	@Override
	public void focusGained(FocusEvent ev) 
	{
		cxTexto_1.selectAll();
	}

	@Override
	public void focusLost(FocusEvent ev) 
	{
		
		
	}
}

Classe do JPanel no qual esta o JLabel


import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Panel_2 extends JPanel
{
	JLabel lb_1;
	
	Panel_1 p1;
	
	public Panel_2() 
	{
		setBorder(BorderFactory.createTitledBorder("Answer Panel"));
				
		lb_1 = new JLabel("Write something in the box over\n up to see this text be changed");
		
		add(lb_1, BorderLayout.NORTH);
		
		setVisible(true);
	}
	
	public void alterText()
	{
		p1 = new Panel_1();
		
		lb_1.setText(p1.sendText());
	}
}

Espero que entendam bem o que se passa aqui, qualquer duvida me contatem por e-mail, cesarbruno2007@gmail.com .

esse seu

Panel_2 p2;

na classe Panel_1 deve estar nulo…

No construtor do Panel_1, vc deveria passar um Panel_2 como parametro

[code]public Panel_1(Panel_2 p2)
{

this.p2 = p2

… seu codigo antigo …
} [/code]

E no main, instancia o p2, depois o p1 e passa o p2 como parametro.

[code]public mainForm()
{
super(“Main Frame”);

p2 = new Panel_2(); 
p1 = new Panel_1(p2);  

…[/code]

ainda ta estranhaço o código, mas ja deve funcionar

heroijapa fiz tudo isso que vc falou, mas o texto do JTextField ainda não esta sendo repassado para o JLabel, quando clico no botão o JLabel fica com valor NULO, e como se o método que faz isto tivesse sido chamado mas o valor do JTestField não houvesse sido repassado, entende cara, valeu ai e continuo na escuta por aqui…

Considerando que você passou o p2 no construtor do seu p1, como o amigo acima indicou, você tem outros problemas:

  1. Primeiro, no seu método actionPerformed() do Panel_1, você está instanciando um novo Panel_2() toda vez ! Ao invés de fazer isso, você tem que usar a referência que você
    passou no construtor:

  2. Dentro do método alterText(), você também está criando uma nova instância, só que desta vez, é do Panel_1(). Você deveria passar a referência, e não criar um objeto novo. Obs: para ficar mais fácil, eu aconselharia você a passar somente a String no método alterText(), assim fica mais simples.

Assim, as modificações ficariam:

// Classe Panel_1

@Override  
    public void actionPerformed(ActionEvent ev)   
    {  
        // p2 = new Panel_2();          não é preciso instanciar um novo Panel_2 !!
          
        if(ev.getSource() == btClear)  
        {  
            cxTexto_1.setText("");  
        }  
          
        if(ev.getSource() == btSend)  
        {  
            p2.alterText( cxTexto_1.getText() );           // você passa a String que você deseja  
        }  
      }
// Classe Panel_2
public void alterText(String textoLabel ) // passa uma String  
    {  
        // p1 = new Panel_1();              isso não é necessário
          
        // lb_1.setText(p1.sendText());        em vez de chamar um método de p1, por que não só passar a String??
        lib_1.setText(textoLabel);
    }  

Rodei seu código aqui com essas modificações, e aparentemente, ta tudo funcionando.
Verifica aí se deu certo… qualquer dúvida.
flws…

GuilhermeKFreitas muito obrigado pela resolução cara, deu tudo certo por aqui, e muito obrigado ao heroijapa por também ter ajudado nisto. Um abraço e ate mais…