Desenhar um quadrado flutuante

Bom dia pessoal, preciso criar um quadrado flutuante, onde seu tamanho seria passado pelo usuario atraves de textfield, imaginem uma fotografia, onde eu utilizaria um quadrado sem preenchimento sobreposta a esta fotografia, e o tamanho do quadrado seria definido pelo usuario… vou postar um print da minha tela com um exemplo em amarelo

Eu já fiz um código desses. O que exatamente você quer saber?

preciso saber como eu faço esse bloco flutuante em cima da imagem… vou carregar uma imagem e esse quadro em cima pro usuario selecionar visualmente o tamanho do quadrado

vou postar uma foto do que eu preciso, na foto esta um scout de cranio, e preciso que o quadrado rosa que vc vera sobreposta a img o usuario possa alterar seu tamanho ou clicando com mouse ou atraves de digitação num textfieldexemplo

ninguem?

Como o Fefo80 disse, qual dificuldade você está tendo exatamente?

Pra desenhar em java, você pode usar Java2D. Basta desenhar a imagem e depois o quadrado, o que fará com que ele fique por cima. Um jeito comum é ter no seu JFrame um JPanel com o método paintComponent sobrescrito, como você pode ver em outros tópicos (exemplo: Imagem)

No código, seria algo assim:

protected void paintComponent(Graphics g){
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g.create();
  g.drawImage(imagem, 0, 0, null);
  g2.drawRect(x1, y1, x2, y2);
  g2.dispose();
}

imagem é um BufferedImage carregado anteriormente. x1, y1, x2 e y2 são as coordenadas de onde você quer exibir o quadrado, e podem ser obtidas de onde você quiser (a partir de JTexFields ou com mouse, usando mouselisteners/mousemotionlistener).

Abraço.

Testa aí! O projeto do NetBeans está em anexo. Deve ter alguns trechos de código morto e algumas coisas poderiam ser melhoradas, mas já é um começo.

Classe com o método main:

package recorte;

import recorte.gui.Janela;

/**
 *
 * @author David
 */
public class Recorte {

    public static void main( String[] args ) {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Janela().setVisible( true );
            }
        });
        
    }
    
}

Classe da Janela do projeto:

package recorte.gui;

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

/**
 *
 * @author David
 */
public class Janela extends JFrame {
    
    public Janela() {
        
        setTitle( "Recorte" );
        setSize( 600, 600 );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setLocationRelativeTo( null );
        
        add( new PainelDesenho(), BorderLayout.CENTER );
        
    }
    
}

Uma forma geométrica genérica:

package recorte.gui.geom;

import java.awt.Graphics2D;

/**
 *
 * @author David
 */
public abstract class Forma {
    
    protected int x;
    protected int y;
    protected int largura;
    protected int altura;
    protected boolean emArraste;

    public abstract boolean intercepta( int x, int y );
    public abstract void atualizar( int x, int y );
    public abstract void desenhar( Graphics2D g2d );
    
    public int getX() {
        return x;
    }

    public void setX( int x ) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY( int y ) {
        this.y = y;
    }

    public int getLargura() {
        return largura;
    }

    public void setLargura( int largura ) {
        this.largura = largura;
    }

    public int getAltura() {
        return altura;
    }

    public void setAltura( int altura ) {
        this.altura = altura;
    }

    public boolean isEmArraste() {
        return emArraste;
    }

    public void setEmArraste( boolean emArraste ) {
        this.emArraste = emArraste;
    }
    
}

Uma forma do tipo retângulo:

package recorte.gui.geom;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;

/**
 *
 * @author David
 */
public class Retangulo extends Forma {
    
    private static final Color COR_CONTORNO = Color.MAGENTA;
    private static final Color COR_CONTORNO_ARRASTE = Color.RED;
    private static final BasicStroke CONTORNO = new BasicStroke( 2 );

    private Ancora aEsquerda;
    private Ancora aDireita;
    private Ancora aCima;
    private Ancora aBaixo;
    
    private Ancora[] ancoras;
    
    public Retangulo( int x, int y, int largura, int altura ) {
        
        this.x = x;
        this.y = y;
        this.largura = largura;
        this.altura = altura;
        
        aEsquerda = new Ancora( 0, 0, 10, 10, Posicao.ESQUERDA );
        aDireita = new Ancora( 0, 0, 10, 10, Posicao.DIREITA );
        aCima = new Ancora( 0, 0, 10, 10, Posicao.CIMA );
        aBaixo = new Ancora( 0, 0, 10, 10, Posicao.BAIXO );
        
        ancoras = new Ancora[]{ aEsquerda, aDireita, aCima, aBaixo };
         
    }
    
    @Override
    public boolean intercepta( int x, int y ) {
        return x >= this.x && x <= this.x + this.largura &&
               y >= this.y && y <= this.y + this.altura;
    }
    
    @Override
    public void atualizar( int x, int y ) {
        this.x = x;
        this.y = y;
    }
    
    @Override
    public void desenhar( Graphics2D g2d ) {
        
        g2d = (Graphics2D) g2d.create();
        
        g2d.setStroke( CONTORNO );
        
        atualizarAncoras();
        
        if ( emArraste ) {
            g2d.setColor( COR_CONTORNO_ARRASTE );
        } else {
            g2d.setColor( COR_CONTORNO );
        }
        
        g2d.drawRect( x, y, largura, altura );
        
        for ( Ancora a : ancoras ) {
            a.desenhar( g2d );
        }
        
        g2d.dispose();
        
    }

    private void atualizarAncoras() {
        
        if ( altura > 10 ) {
            aEsquerda.setX( x - aEsquerda.largura / 2 );
            aEsquerda.setY( y + altura / 2 - aEsquerda.altura / 2 );
            aDireita.setX( x + largura - aDireita.largura / 2 );
            aDireita.setY( y + altura / 2 - aDireita.altura / 2 );
        } else {
            aEsquerda.setX( -100 );
            aEsquerda.setY( -100 );
            aDireita.setX( -100 );
            aDireita.setY( -100 );
        }
        
        if ( largura > 10 ) {
            aCima.setX( x + largura / 2 - aCima.largura / 2 );
            aCima.setY( y - aCima.altura / 2 );
            aBaixo.setX( x + largura / 2 - aBaixo.largura / 2 );
            aBaixo.setY( y + altura - aBaixo.altura / 2 );
        } else {
            aCima.setX( -100 );
            aCima.setY( -100 );
            aBaixo.setX( -100 );
            aBaixo.setY( -100 );
        }
        
    }

    public Ancora[] getAncoras() {
        return ancoras;
    }
    
    public int getX() {
        return x;
    }

    public void setX( int x ) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY( int y ) {
        this.y = y;
    }

    public int getLargura() {
        return largura;
    }

    public void setLargura( int largura ) {
        this.largura = largura;
    }

    public int getAltura() {
        return altura;
    }

    public void setAltura( int altura ) {
        this.altura = altura;
    }

    public boolean isEmArraste() {
        return emArraste;
    }

    public void setEmArraste( boolean emArraste ) {
        this.emArraste = emArraste;
    }
    
}

Uma forma do tipo âncora:

package recorte.gui.geom;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;

/**
 *
 * @author David
 */
public class Ancora extends Forma {

    private static final Color COR_CONTORNO = Color.WHITE;
    private static final Color COR_CONTORNO_ARRASTE = Color.BLUE;
    private static final BasicStroke CONTORNO = new BasicStroke( 2 );
    private final Posicao posicao;

    public Ancora( int x, int y, int largura, int altura, Posicao posicao ) {
        this.x = x;
        this.y = y;
        this.largura = largura;
        this.altura = altura;
        this.posicao = posicao;
    }
    
    @Override
    public boolean intercepta( int x, int y ) {
        return x >= this.x && x <= this.x + this.largura &&
               y >= this.y && y <= this.y + this.altura;
    }

    @Override
    public void atualizar( int x, int y ) {
        this.x = x;
        this.y = y;
    }

    public Posicao getPosicao() {
        return posicao;
    }

    @Override
    public void desenhar( Graphics2D g2d ) {
        
        g2d = (Graphics2D) g2d.create();
        
        g2d.setStroke( CONTORNO );
        
        if ( emArraste ) {
            g2d.setColor( COR_CONTORNO_ARRASTE );
        } else {
            g2d.setColor( COR_CONTORNO );
        }
        
        g2d.fillRect( x, y, largura, altura );
        
        g2d.dispose();
        
    }

}

Enumeração para indicar o tipo de âncora:

package recorte.gui.geom;

/**
 *
 * @author David
 */
public enum Posicao {
    
    ESQUERDA,
    DIREITA,
    CIMA, 
    BAIXO
    
}

O painel de desenho, o “motor gráfico” do programa:

package recorte.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import recorte.gui.geom.Ancora;
import recorte.gui.geom.Retangulo;

/**
 *
 * @author David
 */
public class PainelDesenho extends JPanel {

    private BufferedImage img;
    private Retangulo retangulo;
    private Ancora aSel;
    
    private int xPress;
    private int yPress;
    private int xDif;
    private int yDif;
    
    public PainelDesenho() {
        
        try {
            img = ImageIO.read( new File( "cranio.jpg" ) );
        } catch ( IOException exc ) {
            System.out.println( "Problema ao carregar imagem!" );
        }
        
        retangulo = new Retangulo( 100, 100, 100, 50 );
        
        addMouseListener( new MouseAdapter() {
            
            @Override
            public void mousePressed( MouseEvent e ) {
                
                xPress = e.getX();
                yPress = e.getY();
                
                for ( Ancora a : retangulo.getAncoras() ) {
                    if ( a.intercepta( e.getX(), e.getY() ) ) {
                        a.setEmArraste( true );
                        aSel = a;
                        xDif = xPress - aSel.getX();
                        yDif = yPress - aSel.getY();
                    } else {
                        a.setEmArraste( false );
                    }
                }
                
                if ( aSel == null ) {
                    if ( retangulo.intercepta( e.getX(), e.getY() ) ) {
                        retangulo.setEmArraste( true );
                        xDif = xPress - retangulo.getX();
                        yDif = yPress - retangulo.getY();
                    } else {
                        retangulo.setX( xPress );
                        retangulo.setY( yPress );
                        retangulo.setLargura( 0 );
                        retangulo.setAltura( 0 );
                    }
                }
                
                repaint();
                
            }

            @Override
            public void mouseReleased( MouseEvent e ) {
                retangulo.setEmArraste( false );
                for ( Ancora a : retangulo.getAncoras() ) {
                    a.setEmArraste( false );
                }
                aSel = null;
                repaint();
            }
            
        });
        
        addMouseMotionListener( new MouseAdapter() {
            
            @Override
            public void mouseDragged( MouseEvent e ) {
                
                if ( aSel != null ) {
                    
                    switch ( aSel.getPosicao() ) {
                        
                        case ESQUERDA:
                            
                            aSel.atualizar( e.getX() - xDif, aSel.getY() );
                            
                            int dX = retangulo.getX();
                            retangulo.setX( aSel.getX() + aSel.getLargura() / 2 );
                            dX -= retangulo.getX();
                            
                            retangulo.setLargura( retangulo.getLargura() + dX );
                            
                            break;
                            
                        case DIREITA:
                            
                            aSel.atualizar( e.getX() - xDif, aSel.getY() );
                            retangulo.setLargura( aSel.getX() - retangulo.getX() );
                            
                            break;
                            
                        case CIMA:
                            
                            aSel.atualizar( aSel.getX(), e.getY() - yDif );
                            
                            int dY = retangulo.getY();
                            retangulo.setY( aSel.getY() + aSel.getAltura() / 2 );
                            dY -= retangulo.getY();
                            
                            retangulo.setAltura( retangulo.getAltura() + dY );
                            
                            break;
                            
                        case BAIXO:
                            
                            aSel.atualizar( aSel.getX(), e.getY() - yDif );
                            retangulo.setAltura( aSel.getY() - retangulo.getY() );
                            
                            break;
                    }
                    
                } else if ( retangulo.isEmArraste() ) {
                    retangulo.atualizar( e.getX() - xDif, e.getY() - yDif );
                } else {
                    
                    int largura = e.getX() - xPress;
                    int altura = e.getY() - yPress;
                    
                    if ( largura < 0 ) {
                        retangulo.setX( e.getX() );
                        largura = -largura;
                    }
                    
                    if ( altura < 0 ) {
                        retangulo.setY( e.getY() );
                        altura = -altura;
                    }
                    
                    retangulo.setLargura( largura );
                    retangulo.setAltura( altura );
                    
                }
                
                repaint();
                
            }
            
        });
        
    }
    
    @Override
    protected void paintComponent( Graphics g ) {
        
        Graphics2D g2d = (Graphics2D) g.create();
        
        g2d.clearRect( 0, 0, getWidth(), getHeight() );
        
        g2d.setColor( Color.WHITE );
        g2d.fillRect( 0, 0, getWidth(), getHeight() );
        
        g2d.drawImage( img, 0, 0, null );
        
        if ( retangulo != null ) {
            retangulo.desenhar( g2d );
        }
        
        g2d.dispose();
        
    }
    
}

Recorte.zip (72,2,KB)

5 curtidas

vcs são espetaculares, me ajudaram muito, vou terminar o projeto e postar aqui pra vcs verem … obrigado

só nao consigo baixar o arquivo recorte.zip, pois diz que é privado ou não existe mais, poderia me enviar por email por gentileza??? manhanijava@gmail.com

Vish, eu tenho mania de fazer os exemplos e jogar fora kkk. Basta vc pegar o código das classes que estão no post e montar seu projeto. Está tudo postado textualmente.