Arrastando componente dentro de um jPanel

3 respostas
Evy

Ola pessoal,
tenho um codigo q me permite fazer algumas ações com um retangulo, q mais pra frente vou usar suas medidas pra recortar uma imagem.
com o seguinte codigo consigo faze-lo movimentar dentro de um jFrame:

package mousetracker;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class MouseTracker extends JFrame implements MouseListener{
    
    private int xValue = 0, yValue = 0;
    private int iniciox = 0, inicioy = 0;
    private int fimx = 0, fimy = 0;
    public int condicao = 0;
    public int inicio = 0;
    Rectangle rectAtual = new Rectangle();
    
    /** Creates a new instance of MouseTracker */
    public MouseTracker() 
    {
        super("Demonstrating Mouse Events");
        addMouseListener(this);
        setSize( 400, 300);
        show();
        
        this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(java.awt.event.MouseEvent evt) {
                jPanel3MouseMoved(evt);
            }
            
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                jPanel3MouseDragged(evt);
            }
        });
    }
    
    //Tratadores de evento de MouseListener
    public void mouseClicked(MouseEvent e)
    {
        xValue = e.getX();
        yValue = e.getY(); 
        System.out.println("xValue: "+xValue);
        System.out.println("yValue: "+yValue);
        condicao = 2;
        inicio = 1;
        repaint();
//        mark();
    }
    
    public void mousePressed(MouseEvent e)
    {
        iniciox = e.getX();
        inicioy = e.getY(); 
        System.out.println("Inicio x: "+iniciox);
        System.out.println("Inicio y: "+inicioy);
        repaint();
    }
    
    public void mouseReleased(MouseEvent e)
    {
        fimx = e.getX();
        fimy = e.getY();
        System.out.println("Inicio do retangulo: ["+(fimx - 60)+","+(fimy - 70)+"]");
        //System.out.println("Fim y: "+(fimy - 70));
    }    

    public void mouseEntered(MouseEvent e)
    {
       if (inicio == 0)
           condicao = 1;
      /* else
           condicao = 0;*/
    }    
    
    public void mouseExited(MouseEvent e)
    {
      //  statusBar.setText("Mouse outside the window");
    }    
        
    public void paint (Graphics g)
    {
        g.setColor(Color.blue);
        g.clearRect(0, 0, this.getWidth(),this.getHeight());
        if(condicao > 0){
            Rectangle box = cortarRect(rectAtual);
            box.x = rectAtual.x;
            box.y = rectAtual.y;
            g.drawRect(box.x - 60, box.y - 70, box.width - 1, box.height - 1);
        }
    }  

    Rectangle cortarRect(Rectangle miRect){
        int x = miRect.x;
        int y = miRect.y;
        return new Rectangle(x, y, 120, 140);
    }
    private void jPanel3MouseMoved(MouseEvent evt) {

        rectAtual.x = evt.getX();
        rectAtual.y = evt.getY();
        if (condicao == 1)
            repaint();
    }
    
    private void jPanel3MouseDragged(MouseEvent evt) {
        rectAtual.x = evt.getX();
        rectAtual.y = evt.getY();
        if (condicao == 2)
            repaint();
    }
    
    public void mark()
    {
      /*  java.awt.Image image = ((javax.swing.ImageIcon) icon).getImage();   
        java.awt.image.FilteredImageSource fis = new java.awt.image.FilteredImageSource(   
            image.getSource(), new java.awt.image.CropImageFilter((int)(xValue), (int)(yValue), 150, 200)   
            );   
        image = null;   
        image = java.awt.Toolkit.getDefaultToolkit().createImage(fis);
    */
    }
    
    public static void main(String[] args)
    {
        MouseTracker app = new MouseTracker();
        
        app.addWindowListener(
            new WindowAdapter() 
            {
                public void windowClosing(WindowEvent e)
                {
                    System.exit(0);
                }
            }
        );
    }    
}

A minha dificuldade é fazer essas açoes acontecerem apenas dentro de um jpanel.
Parece q o metodo repaint esta fazendo sumir todos os componentes do frame.
Alguem sabe como posso fazer pra funcionar normalmente dentro do jpanel sem eu perder os outros componentes do frame?

3 Respostas

heatcold

Acredito que você tenha que sobreescrever o método paint() do jPanel e não do JFrame para que o programa tenha esse comportamento.
Crie um novo JPanel, usando herança, que tenha o comportamento desejado.

davidbuzatto

É um painel e não um desenho.

http://www.guj.com.br/posts/list/48266.java

Evy

davidbuzatto:
É um painel e não um desenho.

http://www.guj.com.br/posts/list/48266.java

Entao o que eu to fazendo de errado é usar o repaint()?
Tava olhando em seu codigo, voce em nenhum momento usa repaint().

Criado 20 de fevereiro de 2008
Ultima resposta 21 de fev. de 2008
Respostas 3
Participantes 3