// file Select.java // Demo of Selection applied to four imported images // Harriet Fell // February 5, 2002 import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; import java.awt.image.*; import java.util.Random; public class ImageSelect extends JComponent implements MouseListener, MouseMotionListener { private MyImage myImages [] = new MyImage[4]; public ImageSelect(int windowWidth) { // Listen for mouse movements and clicks addMouseMotionListener(this); addMouseListener(this); // Allocate array for four images // Initialize images for (int im = 0; im < 4; im++) myImages[im] = new MyImage(); // Load images myImages[0].image = Toolkit.getDefaultToolkit().getImage("Tradscantia3b.JPG"); myImages[1].image = Toolkit.getDefaultToolkit().getImage("Margaritte1b.JPG"); myImages[2].image = Toolkit.getDefaultToolkit().getImage("GiantHosta1b.JPG"); myImages[3].image = Toolkit.getDefaultToolkit().getImage("RedTulip5b.jpg"); // Initialize transforms for (int im = 0; im < 4; im++) { myImages[im].transform = new AffineTransform(); //set to Identity myImages[im].x0 = im*windowWidth/4; myImages[im].y0 = 0; myImages[im].numRotations = 0; myImages[im].transform.translate(myImages[im].x0, myImages[im].y0); myImages[im].selected = false; myImages[im].bounds = new Rectangle2D.Double(); myImages[im].bounds.setRect(0, 0, windowWidth/4, windowWidth/4); } } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; int wd = getSize().width; int ht = getSize().height; AffineTransform id = new AffineTransform(); //Identity transform for (int im = 0; im < 4; im++) { myImages[im].bounds.setRect(0, 0, wd/4, ht/4); // for resizing myImages[im].transform.setToTranslation(myImages[im].x0, myImages[im].y0); myImages[im].transform.rotate(myImages[im].numRotations*Math.PI/6); g2.setTransform(id); g2.translate(0, 22); g2.transform(myImages[im].transform); //g2.translate(myImages[im].x0, myImages[im].y0); g2.drawImage(myImages[im].image, 0, 0, wd/4, ht/4, this); //highlight selected image if (myImages[im].selected) { g2.setPaint(Color.yellow); g2.setStroke(new BasicStroke(3)); g2.draw(myImages[im].bounds); //System.out.print(im + "selected"); g2.setPaint(Color.black); g2.setStroke(new BasicStroke(1)); } } g2.setTransform(id); g2.translate(0, 22); } public void mouseDragged(MouseEvent e) { /* int mods = e.getModifiers(); // mouse dragged for image A if ((mods & InputEvent.SHIFT_MASK) != 0) // rotate counter-clockwise if shift only is down numRotationsA--; else if ((mods & InputEvent.CTRL_MASK) != 0) // rotate clockwise numRotationsA++; else { x0A = e.getX(); y0A = e.getY(); translateA.setToTranslation(x0A, y0A); } rotateA.setToRotation(numRotationsA*Math.PI/6); repaint(); */ for (int im = 0; im < 4; im++) { if(myImages[im].selected) { //myImages[im].transform.translate(e.getX() - myImages[im].x0, e.getY() - myImages[im].y0); myImages[im].x0 = e.getX(); myImages[im].y0 = e.getY(); } } repaint(); } public void mouseMoved(MouseEvent e) { int mods = e.getModifiers(); for (int im = 0; im < 4; im++) { if(myImages[im].selected) { if ((mods & InputEvent.SHIFT_MASK) != 0) // rotate counter-clockwise if shift is down myImages[im].numRotations++; else if ((mods & InputEvent.CTRL_MASK) != 0) // rotate clockwise if Ctrl is down myImages[im].numRotations--; } } repaint(); } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseClicked(MouseEvent e) { int x, y; x = e.getX(); y = e.getY(); AffineTransform at = new AffineTransform(); boolean selected = false; for (int im = 0; im < 4; im++) { try{ Point2D pt = new Point2D.Double(x, y); at = myImages[im].transform.createInverse(); pt = at.transform(pt, pt); //System.out.print(pt.getX() + " " + pt.getY() + '\n'); if (myImages[im].bounds.contains(pt) && !selected) { myImages[im].selected = true; selected = true; } else myImages[im].selected = false; } catch(NoninvertibleTransformException nte) {} } repaint(); } public static void main(String[] args){ JFrame f = new JFrame("ImageSelect"); int windowWidth = 600; Container c = f.getContentPane(); c.setLayout(new BorderLayout()); c.add(new ImageSelect(windowWidth), BorderLayout.CENTER); f.setSize(windowWidth, windowWidth + 22); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setVisible(true); } }