Retornar valor de um metodo?

Salve galera,

Estou tentando retornar o valor de um método para um JLabel, o caso é que criei 2 JPanel sendo um q implementa MouseMotionLiestener e quero retornar os valores para esse JLabel.

vejam

//Jpanel1
public class Panel1 extends JPanel implements MouseLiestener, MouseMotionLiestener{
    public class Panel1(){
        this.addMouseLiestener(this);
        this.addMouseMotionLiestener(this);
    }

    public String retornaXeY(MouseEvent e){
         x = e.getX();
         y = e.getY();
         String xy ="x: " + x + "    y: " + y; 
         return xy;
    }

    public void mouseMoved(MouseEvent e){
          retornaXeY(e);
    }
 
}

//JPanel 2, nao sei como fazer, estou pesquisando mas ainda naum encontrei....Tentei add um mouseMotionLiestener mas ainda naum consegui.
public class Panel2 extends JPanel{
   public class Panel2(){
        JLabel exibeXY = new JLabel();
        exibeXY.addMouseMotionLiestener(exibeXY);
        this.add(exibeXY);
   }
}

Como fazer para quando o mouse se mover sobre o Panel1 com mouseMoved(), ir atualizando o setText() do JLabel q esta no Panel2.

obrigado.

Boa noite Fernando.

Primeiro, para voce acessar o método “RetornaXeY” da classe JPanel1 em outra classe qualquer, mesmo que seja outro JPanel, voce terá que instanciar a classe JPanel1, isto porque os métodos lá declarados não são estáticos, e sim dinâmicos, ou seja, são métodos de instância, então só através de instância que voce conseguirá acessá-los.

Segundo, para voce passar o valor das coordenadas para outra classe, voce tem que ter na classe JPanel1 uma referência da classe JPanel2, ou seja, voce também terá que ter uma instância de JPanel2 na classe JPanel1, para poder acessar o JLabel de JPanel2, em outras palavras, JPanel1 tem que ter uma instância de JPanel2 e vice versa. Complicado :?: :?: :?: Nem tanto, portanto, vamos fazer este projeto, tendo por base apenas o JPanel1 e uma Classe FramePrincipal que extenda JFrame, para que voce entenda melhor.

Antes porém permita-me dar uma garibada na classe JPanel1, já com a instância de FramePrincipal, desta forma:

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;

public class JPanel1 extends JPanel {
    
    private FramePrincipal frame = null;
       
    public JPanel1(FramePrincipal frame){
        setFramePrincipal(frame);
        this.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
              //  throw new UnsupportedOperationException("Not supported yet.");
            }
            
            @Override
            public void mouseMoved(MouseEvent e) {
                getFramePrincipal().setCoordenadas("Coordenada X = "+e.getX()+" e coordenada Y = "+e.getY());
            }
        });
    }
    
    public FramePrincipal getFramePrincipal(){
        return frame;
    }
    
    public void setFramePrincipal(FramePrincipal frame){
        this.frame = frame;
    }
      
}

Agora vamos a classe FramePrincipal com a instância desse JPanel2, desta forma:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class FramePrincipal extends JFrame {
    
    private JLabel coord = null;
    
    public static void main(String args[]){
        FramePrincipal frame = new FramePrincipal();
        frame.setVisible(true);
    }
    
    public FramePrincipal(){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setContentPane(getContainer());
        setBounds(200, 200, 400, 400);
        pack();
        setLocationRelativeTo(null);   
    }
    
    private JPanel getContainer(){
        JPanel panel = new JPanel(new BorderLayout());
        /* Aqui eu instancio JPanel1 e adiciono ao novo JPanel,
         passando como referencia a classe FramePrincipal (this)
         no construtor do JPanel1.*/
        JPanel1 panel1 = new JPanel1(this);
        panel.add(BorderLayout.CENTER, panel1);
        coord = new JLabel();
        panel.add(BorderLayout.SOUTH, coord);
        return panel;
    }


    /* É aqui que eu crio o método setCoordenadas 
       que vai informar dentro do JLabel "coord", as coordenadas
       que é invocada no Evento MouseMoved
       da classe JPanel1 através da referência de
       FramePrincipal que foi passada a ele.   
    public void setCoordenadas(String coordenada){
        coord.setText(coordenada);
    }
    
}

Simples, não 8)

Repare que a Orientação a Objetos permite também o que eu costumo chamar de “Simbiose Total de Objetos”, passando-se referências, e muito mais.

Opa discorpio, eu sempre uso essa tecnica com sistemas ERP, mas acredite vc q nem parei pra raciocinar isso, acho q ando estudando muito Java2D e a Engenharia Civil ta me deixando louco…kkk !!!
Mas foi bom pra me chamar atenção novamente a isso. Com sistemas ERP eu uso essa técnica para trabalhar com Janelas mandando valores de uma pra outra.

mas é isso ae, vlw e obrigado kra.

Bom dia Fernando.

Pensando melhor, existe uma maneira de simplificar esse seu projeto, até porque, já que voce trabalha com sistemas ERP, ficar criando várias instâncias de janelas para janelas, pode acarretar um emaranhado de instâncias e ficar complicado na manutenção destas instâncias.

A menos, é claro, que seja necessário passar as instâncias da classe para outras classes, contudo, se você estiver trabalhando só com eventos, fica mais fácil voce tratar os eventos dentro das classes onde você esta trabalhando com determinada instância, do que na própria classe da instância. Não entendeu :?: Então vamos exemplicar com a classe JPanel1.

public class JPanel1 extends JPanel {  
   
         
    public JPanel1(){
        setPreferredSize(new Dimension(400,400));  
        // Implementações
       .......
    }

    // Outros métodos implementados.

}

Repare que em JPanel1, eu não implementei nenhum evento, isto porque voce pode tratar esses eventos através da instância de JPanel1 dentro do FramePrincipal ou outra classe qualquer, desta forma.

import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class FramePrincipal extends JFrame {
    
    private JLabel coord = null;
    
    public static void main(String args[]){
        FramePrincipal frame = new FramePrincipal();
        frame.setVisible(true);
    }
    
    public FramePrincipal(){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        JPanel1 panel1 = new JPanel1();
        panel1.addMouseMotionListener(new MouseMotionAdapter(){
            @Override
            public void mouseMoved(MouseEvent e) {
                // Aqui eu posso jogar o texto direto em JLabel "coord"
                coord.setText("Coordenada X = "+e.getX()+" e coordenada Y = "+e.getY());
            }
        });
        getContentPane().add(panel1, BorderLayout.CENTER);
        coord = new JLabel();
        getContentPane().add(coord, BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);   
    }
    
    // Novas Implementações
   ......
   ......
}

Repare que o seu código ficou mais enxuto, mais operacional, com execução mais rápida, isto porque o interpretador Java, tem pouco código a interpretar. Se voce executar este último código, verá que surtirá o mesmo efeito do primeiro, com uma pequena diferença, executará, embora de maneira imperceptível, mais rápido, e ocupando menos memória, e isto em aplicações gigantes e complexas, surti um efeito muito mais benéfico, pois a aplicação fica mais leve e funcional.

Eu sempre tenho o costume de enxugar códigos, fazendo a aplicação de maneira mais simples possível, porém que me traga o resultado esperado.

E sempre costumo dizer também que DEUS, através de uma singularidade, criou todo este Universo complexo e maravilhoso.

P.S. Esta implementação mais enxuta que apresentei agora, é válida em se tratando de eventos e métodos e atributos que voce possa acessar diretamente na instância de classes, contudo se não houver outro jeito de acessar esses métodos através de suas instâncias, o jeito é fazer a referência explicada no post anterior.

Opa discorpio, como havia te dito antes da maneira do outro Post eu ja usava em sistemas ERP, mas vou te falar uma coisa, ultimamente num ando raciocinando muito…rs ! To precisando dar uma parada e dormir um pouco, pq ficar estudando calculo e java2d ate tarde ta me deixando meio pirado.

mas nesse post, realmente num havia tentado, e como vc disse fica mesmo muito mais enxuto.

vlw ae, obrigado.