Re: Drag two images with a mouse anywhere in the frame
On Mar 21, 7:48 am, "John B. Matthews" <nos...@nospam.invalid> wrote:
In article <im66uv$ig...@news.eternal-september.org>,
Daniele Futtorovic <da.futt.n...@laposte-dot-net.invalid> wrote:
On 21/03/2011 00:42, bH allegedly wrote:
Hi All, I need a java application/applet program that will load two
images in one frame. I should also be able to drag each image
independently with the mouse within that one frame. Where I drag
the images to will be independent and thus the placement of each
image will not have preset locations available. I already have a
java program where images can be moved with the mouse to a open,
preset locations.
I have searched for demos. I find that there are none. Perhaps I
didn't word the search phrase correctly. For instance "java demo
'move two images with a mouse.'"
How about a layered layout? Put your images in a JLabel on some
different layers, then attach a simple MouseListener to each of the
labels, store the mouse position (careful whether it's absolute or
relative) on MOUSE_DOWN, compare to the position on MOUSE_UP, do a
diff and setBounds, possibly with some sandboxing. Or implement
mouseDragged and do the diffs in real-time.
bH: Let me endorse DF's suggestion. Here's one of my favorite examples
of using JLayeredPane in this way:
<http://stackoverflow.com/questions/2562685>
As an alternative, JInternalFrame is also worth a look:
<http://download.oracle.com/javase/tutorial/uiswing/components/interna...=
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>- Hide quoted text -
- Show quoted text -
Hi Daniele and John,
A big "THANKS" for your replies.
The program below takes 3 images
allows for showing them in random order
at random locations. The user then uses the mouse to
move the images to reorder. It is a work in progress.
I have not studied the entire list of your
recommendations but eventually hope to do so.
I appreciate your responses very much.
bH
/* original: http://www.thatsjava.com/java-essentials/49032/
*
* Version2: 22 March 2011:
* Three XX.png images stored in folder named "images"
* The program takes the images puts them in random order
* at random locations. The user then uses the mouse to
* move the images to reorder. bH
*/
import java.awt.EventQueue;
import java.awt.Container;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event. MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing. JLayeredPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class LabelDragAndDropVer2 extends JFrame implements
MouseListener, MouseMotionListener
{
JLayeredPane layeredPane;
Component dragComponent;
int xAdjustment;
int yAdjustment;
private String strNumber[] = new String [3];
private int number = 0 ;
private Random wheel = new Random();
int high= 60;
int low = 20;
int numPictures = 3;
// two arrays stores x,y values
int[] xPoints = new int[numPictures];
int[] yPoints = new int[numPictures];
public LabelDragAndDropVer2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
setVisible(true);
}
public void init() {
// Use a Layered Pane for this this application
layeredPane = new JLayeredPane();
layeredPane.setLayout( null );
layeredPane.addMouseListener( this );
layeredPane.addMouseMotionListener( this );
getContentPane().add(layeredPane);
// ordering the location of picture random
for (int i= 0;i <numPictures; i++){
int m = wheel.nextInt(high - low + 1 ) + low;
xPoints[i]= m;
int n = wheel.nextInt(high - low + 1 ) + low;
yPoints[i]= n;
System.out.println(i+ " "+ m + " ," + n);
}
System.out.println("");
for(int i = 0; i<3; i++){
strNumber[i] = Integer.toString(i);
number = Integer.parseInt(strNumber[i]);
System.out.println(number);
}
// ordering the images randomly
List<String> inputList = Arrays.asList(strNumber);
Collections.shuffle(inputList);
for (int i= 0;i <3; i++){
number = Integer.parseInt(strNumber[i]);
ImageIcon julia = new ImageIcon("images/MH"+
number + ".png");
JLabel label = new JLabel(julia);
label.setLocation(xPoints[i], yPoints[i]);
label.setSize( label.getPreferredSize() );
layeredPane.add(label);
}
Container contentPane= getContentPane();
contentPane.setLayout(new GridLayout(1,2) );
setSize(600,600);// frame size
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/*
** Determine if we clicked on a moveable component
*/
public void mousePressed(MouseEvent e)
{
dragComponent = null;
Component c = layeredPane.findComponentAt(e.getX(),
e.getY());
if (c instanceof JLayeredPane) return;
dragComponent = c;
xAdjustment = dragComponent.getLocation().x - e.getX();
yAdjustment = dragComponent.getLocation().y - e.getY();
dragComponent.setLocation(e.getX() + xAdjustment,
e.getY() + yAdjustment);
layeredPane.moveToFront(dragComponent);
}
/*
** Move the component around the panel
*/
public void mouseDragged(MouseEvent me)
{
if (dragComponent == null) return;
dragComponent.setLocation(me.getX() + xAdjustment,
me.getY() + yAdjustment);
}
/*
** Deselect the component
*/
public void mouseReleased(MouseEvent e)
{
dragComponent = null;
}
public void mouseClicked(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new LabelDragAndDropVer2();
}
});
}
}