Olá, alguém te ideia de como eu posso fazer em um progrma q estou desenvolvendo para visualizar imagens, a mesma coisa q se tem quando se clica na barra de espaço no phtoshop e aparece uma maozinha onde podemos ir arrastando a imagem???
[RESOLVIDO] arrastar a imagem
22 Respostas
Perguntinha imbecil número 1. Como é que você representa as formas geométricas no seu programa? Quais estruturas de dados você está pensando em usar? Provavelmente você vai ter de pensar bem nisso antes de escrever uma única linha de programa.
ai cara pq vc eh tão estupido em responder? qual é o seu problema.
o imagem q quero ver tah em jpg dentro de um jlabel
mas de boa, sua resposta não quero mais não
aqui eh um lugar pra gente tirar duvidas e não ficar tirando com a cara do outro.
Você cria uma classe que extende JLabel e coloca um MouseMotionListener nela, depois implemente o mouseDragged, ai toda as variaveis que forem instanciadas dela, já possuirão a função de seguir o mouse quando alguém clicar e arrastar o mesmo.
O painel que irá adicionar as imagens tem que possuir o layout null para que as imagens tenham movimento livre.
private class ObjetoMovel extends JLabel {
MouseMotionListener mml;
public ObjetoMovel(String endereco) {
super.setIcon(new javax.swing.ImageIcon(endereco));
criaListener();
addMouseMotionListener(mml);
}
private void criaListener() {
mml = new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
/*Serve para posicionar o mouse no meio da imagem*/
setLocation(e.getXOnScreen() - (int) getBounds().getWidth() / 2,
e.getYOnScreen() - (int) getBounds().getHeight() / 2);
}
public void mouseMoved(MouseEvent e) {
}
};
}
}
A questão do cursor se transformar em uma mão, você deve implementar dentro desta classe um MouseListener, quando o mouse entrar e sair do objeto você vai dar um setCursor(new Cursor(/TIPO DO CURSOR/));
Espero que ajude!
VLW!
Oi! Valeu pela ajuda, mas tenho alumas duvidas:
Na parte do código q vc colocou:
public void mouseDragged(MouseEvent e) {
/*Serve para posicionar o mouse no meio da imagem*/
setLocation(e.getXOnScreen() - (int) getBounds().getWidth() / 2,
e.getYOnScreen() - (int) getBounds().getHeight() / 2);
}
pelo o q eu entendi esse metodo tah apenas posicionando o mouse no meio da imagem, certo?
Mas o movivemto de a imagem ir se arrastando conforme o movimeto do mouse, eu ainda teria q implementar???
Obrigada!!!
ah soh uma outra coisinha…
eu já tô com a imagem dentro de um icon q estah dentro de um jlabel… ou seja apartir disso, eu ja posso adicionar esse addMouseMotionListener(mml) nesse meu jlabel?
eu tô tentando fazer do seguinte modo:
labelMapa = new JLabel();
labelMapa = metodos.getJLabelMap();
labelMapa.setLocation(0, 0);
labelMapa.setVisible(true);
labelMapa.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
scrollImage.getHorizontalScrollBar().setValue(x);
scrollImage.getVerticalScrollBar().setValue(y);
repaint();
}
});
Mas quando eu tento arrastar a imagem ela vai pro cano so scrollImage e de lá nao sai mais…
Soh para avisar meu JLabel tah dentro de um JScrollPane
ai cara pq vc eh tão estupido em responder? qual é o seu problema.
o imagem q quero ver tah em jpg dentro de um jlabel
mas de boa, sua resposta não quero mais não
aqui eh um lugar pra gente tirar duvidas e não ficar tirando com a cara do outro.
:shock: vixe!!! :shock:
Relaxa oitathi o entanglement está sempre ajudando a galerinha por aqui certamente foi um mal entendido. 
Eu sou um pouco grosso mesmo.
Mas é que queria saber mais ou menos o que você gostaria de fazer, porque como sempre digo: “começou pensando errado, é difícil de consertar depois”. Tem certas coisas que em Java você tem de pensar ao contrário que você acha que tem de fazer.
Eu lembro de você ter perguntado como é que se fazia para fazer drag & drop de arquivos, não é muito difícil, mas precisa de um conceito anterior.
Se entendi o que vc precisa, talvez esta idéia (escrever no canvas) funcione melhor.
Dá uma olhada neste link http://www.java2s.com/Code/Java/2D-Graphics-GUI/Mousedraganddroptodraw.htm
O código correspondente ao link segue abaixo, execute para dar uma olhada nos resultados.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Ellipse extends JFrame {
DrawingCanvas canvas;
JLabel location;
public Ellipse() {
super();
Container container = getContentPane();
canvas = new DrawingCanvas();
container.add(canvas);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
panel.add(new JLabel("x,y: ", JLabel.RIGHT));
location = new JLabel("");
panel.add(location);
container.add(panel, BorderLayout.SOUTH);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setSize(600,300);
setVisible(true);
}
public static void main(String arg[]) {
new Ellipse();
}
class DrawingCanvas extends JPanel {
double x, y, w, h;
int x1, y1, x2, y2;
Ellipse2D ellipse;
Ellipse2D selectedShape;
Rectangle2D boundingRec;
Cursor curCursor;
public DrawingCanvas() {
x = 20;
y = 20;
w = 100;
h = 75;
setBackground(Color.white);
addMouseListener(new MyMouseListener());
addMouseMotionListener(new MyMouseMotionListener());
}
public void paint(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
ellipse = new Ellipse2D.Double(x, y, w, h);
g2D.draw(ellipse);
if (boundingRec != null) {
drawHighlightSquares(g2D, boundingRec);
}
if (curCursor != null)
setCursor(curCursor);
}
public void drawHighlightSquares(Graphics2D g2D, Rectangle2D r) {
double x = r.getX();
double y = r.getY();
double w = r.getWidth();
double h = r.getHeight();
g2D.setColor(Color.black);
g2D.fill(new Rectangle.Double(x - 3.0, y - 3.0, 6.0, 6.0));
g2D
.fill(new Rectangle.Double(x + w * 0.5 - 3.0, y - 3.0, 6.0,
6.0));
g2D.fill(new Rectangle.Double(x + w - 3.0, y - 3.0, 6.0, 6.0));
g2D
.fill(new Rectangle.Double(x - 3.0, y + h * 0.5 - 3.0, 6.0,
6.0));
g2D.fill(new Rectangle.Double(x + w - 3.0, y + h * 0.5 - 3.0, 6.0,
6.0));
g2D.fill(new Rectangle.Double(x - 3.0, y + h - 3.0, 6.0, 6.0));
g2D.fill(new Rectangle.Double(x + w * 0.5 - 3.0, y + h - 3.0, 6.0,
6.0));
g2D.fill(new Rectangle.Double(x + w - 3.0, y + h - 3.0, 6.0, 6.0));
}
class MyMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY())) {
selectedShape = ellipse;
if (boundingRec != null)
boundingRec = ellipse.getBounds2D();
displayParameters(selectedShape);
} else {
boundingRec = null;
location.setText("");
}
canvas.repaint();
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY())) {
boundingRec = ellipse.getBounds2D();
selectedShape = ellipse;
displayParameters(selectedShape);
}
canvas.repaint();
}
public void mouseClicked(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY())) {
selectedShape = ellipse;
boundingRec = ellipse.getBounds2D();
displayParameters(selectedShape);
} else {
if (boundingRec != null)
boundingRec = null;
location.setText("");
}
canvas.repaint();
}
}
class MyMouseMotionListener extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
if (ellipse.contains(e.getX(), e.getY())) {
boundingRec = null;
selectedShape = ellipse;
x2 = e.getX();
y2 = e.getY();
x = x + x2 - x1;
y = y + y2 - y1;
x1 = x2;
y1 = y2;
}
if (selectedShape != null)
displayParameters(selectedShape);
canvas.repaint();
}
public void mouseMoved(MouseEvent e) {
if (ellipse != null) {
if (ellipse.contains(e.getX(), e.getY())) {
curCursor = Cursor
.getPredefinedCursor(Cursor.HAND_CURSOR);
} else {
curCursor = Cursor.getDefaultCursor();
}
}
canvas.repaint();
}
}
public void displayParameters(Shape shape) {
double x = selectedShape.getX();
double y = selectedShape.getY();
double w = selectedShape.getWidth();
double h = selectedShape.getHeight();
String locString = "(" + Double.toString(x) + ","
+ Double.toString(y) + ")";
String sizeString = "(" + Double.toString(w) + ","
+ Double.toString(h) + ")";
location.setText(locString);
}
}
}
então cara, na verdade eu quase consegui o q eu queria…
vou de tizer cmo é q tah mais ou menos a minh apalicação pra vcs terem uma ideia melhor…
eu tenho uma layeredPane e dentro dela tenho diversos jlabels, cada um com uma imagem. e essa layeredPane esta dentro de um jscrollpane.
eu fiz o seguinte:
layeredPane.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
layeredPane.setLocation(x, y);
layeredPane.validate();
}
});
E uma parte eu posso dizer q funcionou. Se eu mexer o mouse devagarzinho, todos os meu componentes da layeredPane movem-se junto com ela, como eu quero!! Porém, quando eu arrasto o mouse com certa rapidez, a layeredPane some! ou seja tudo q está dentro dela desaparece! eu dei validate(), tentei tb com repaint(), mas não funcionou…
Será q alguém tem ideia do q possa estar acontecendo?
}
Talvez vc esteja utilizando objetos pesados demais para atingir o objetivo. Ao mover o mouse rapidamente não dá tempo de executar o refresh completo antes da alteração do conteúdo das variáves feita pelos listeners do mouse.
Reflita para ver se é isto, espero que não.
flws
Muito provavelmente é isso, pq eu tenho q carregar imagen smuito pesadas q são mapas estremamente detalhados para implantação de um sistema de rastreamanto gps… ou seja, as imagens terão de ser grandes mesmo…
vc tem, algum ideia de como contornar isso?
talveza se eu mudasse a posição do scroll conforme o mouse isso não aconteceria… o problema eh q eu não sei quando eu chamo o metodo e.getY();
o q na verdade ele está pegando como referencia…
pensei q fosse meu jscroll mas percebi q não é
Normalmente, quando se faz isso, mostra-se apenas o contorno serrilhado do retângulo, não a imagem completa. Quando soltar o mouse, então você pode redesenhar a imagem.
Oi! Valeu pela ajuda, mas tenho alumas duvidas:
Na parte do código q vc colocou:public void mouseDragged(MouseEvent e) { /*Serve para posicionar o mouse no meio da imagem*/ setLocation(e.getXOnScreen() - (int) getBounds().getWidth() / 2, e.getYOnScreen() - (int) getBounds().getHeight() / 2); }pelo o q eu entendi esse metodo tah apenas posicionando o mouse no meio da imagem, certo?
Mas o movivemto de a imagem ir se arrastando conforme o movimeto do mouse, eu ainda teria q implementar???
Obrigada!!!
O que posiciona o mouse no meio da imagem é a subtração da posição do mouse menos a largura da imagem divido pór 2.
Quando você clica em uma imagem e arrasta, este método é invocado atualizando a posição da imagem de acordo com as coordenadas do mouse.
Tente fazer com que cada JLabel seu seja instanciado desta classe!
ObjetoMovel obj = new ObjetoMovel("Endereco da imagem");
Outra coisa, se o getX() e o getY() estiverem dando errado tente utilizar o getXOnScreen() e o getYOnScreen()
Compile este código :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ImagemEmMovimento {
public ImagemEmMovimento() {
JFrame f = new JFrame();
JPanel p = new JPanel();
ObjetoMovel om = new ObjetoMovel("Endereco da imagem");
p.setLayout(null);
p.add(om);
/*Dimensione a imagem com a localização e o tamanho dela*/
om.setBounds(50, 50, 150, 150);
f.getContentPane().add(p, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(new Dimension(700, 600));
f.setVisible(true);
}
void initComponents() {
}
public static void main(String[] args) {
new ImagemEmMovimento();
}
/*Esta classe cria JLabel's com imagem e eventos do mouse*/
private class ObjetoMovel extends JLabel {
MouseMotionListener mml;
MouseListener ml;
public ObjetoMovel(String endereco) {
super.setIcon(new ImageIcon(endereco));
criaListener();
addMouseMotionListener(mml);
}
private void criaListener() {
mml = new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
/*Serve para posicionar a imagem de acordo com as coordenadas do mouse e posicionar o mouse no meio da imagem*/
setLocation(e.getXOnScreen() - (int) getBounds().getWidth() / 2,
e.getYOnScreen() - (int) getBounds().getHeight() / 2);
}
public void mouseMoved(MouseEvent e) {
}
};
ml = new MouseListener() {
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
};
}
}
}
Não é isso q eu tô querendo…
Naverdade o que eu quero tah nessa pagina:
http://www.javafaq.nu/java-bookpage-18-2.html
soh q eu não tô conseguindo implementar para o q eu tô querendo…
Se vc puer me ajudar
Não é isso q eu tô querendo…
Naverdade o que eu quero tah nessa pagina:
http://www.javafaq.nu/java-bookpage-18-2.htmlsoh q eu não tô conseguindo implementar para o q eu tô querendo…
Se vc puer me ajudar
Olhei, copiei e compilei o código, mas a imagem não saia do lugar.
Eu não vi muita diferença entre os códigos não, mas pelo menos o meu funciona, mesmo
sabendo o código que fiz trabalha com um layout null, não sei se essa a melhor forma, mas
também estou procurando como se faz um DragAndDrope de imagens bem melhor. hehe.
eu fiz dese jeito:
scrollImage.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
@Override
public void mousePressed(MouseEvent me) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
m_XDifference = me.getX();
m_YDifference = me.getY();
}
});
scrollImage.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent e) {
Point p= scrollImage.getViewport().getViewPosition();
int newX = p.x - (e.getX()-m_XDifference);
int newY = p.y - (e.getY()-m_YDifference);
int maxX = layeredPane.getWidth()-scrollImage.getViewport().getWidth();
int maxY= layeredPane.getHeight()-scrollImage.getViewport().getHeight();
if (newX < 0) newX = 0;
if (newX > maxX) newX = maxX;
if (newY < 0) newY = 0;
if (newY > maxY) newY = maxY;
scrollImage.getViewport().setViewPosition(new Point(newX, newY));
}
});
Mas o problema é q o mouse parece q tah muito rápido… os movimentos ficam muito descordenandos… parece q o mouse fica sensivel ao minimo movimento, o q não me dá muito controle na imagem…
a´guém sabe o q eu posso ter feito de errrado?
eh q vc tem q testar aquele codigo ( o do site) com uma imagem maior do q o scroll, senão não vai funcionar mesmo!
Bom gente eu consegui
Vou postar o codigo caso algum dia alguém tenha uma imagem dentro de um JScrollPane e queira q ela se movimente apartir do movimento do mouse:
scrollImage.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
@Override
public void mousePressed(MouseEvent me) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
m_XDifference = me.getX();
m_YDifference = me.getY();
}
});
scrollImage.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent e) {
Point p= scrollImage.getViewport().getViewPosition();
int newX = p.x - (e.getX()-m_XDifference);
int newY = p.y - (e.getY()-m_YDifference);
m_XDifference=e.getX();
m_YDifference=e.getY();
int maxX = layeredPane.getWidth()-scrollImage.getViewport().getWidth();
int maxY = layeredPane.getHeight()-scrollImage.getViewport().getHeight();
if (newX < 0) newX = 0;
if (newX > maxX) newX = maxX;
if (newY < 0) newY = 0;
if (newY > maxY) newY = maxY;
scrollImage.getViewport().setViewPosition(new Point(newX, newY));
}
});
Ah! Agora entendi o que você queria fazer, pensava que era um drag e um drop de objetos,
mas valeu, fica legal o usuário movimentar a imagem sem precisar das barras de rolagens.