Desenhar um quadrado flutuante

9 respostas
javaprogramação
M

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

9 Respostas

F

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

M

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

M

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

M

ninguem?

T

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.

D

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)

M

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

M

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

D

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.

Criado 10 de novembro de 2021
Ultima resposta 13 de dez. de 2021
Respostas 9
Participantes 4