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 textfield
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)
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.