Java tutorial
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class AffineTransformApp extends JFrame { DisplayPanel displayPanel; JComboBox scaleXval, scaleYval, shearXval, shearYval; String[] scaleValues = { "0.10", "0.25", "0.50", "0.75", "1.00", "1.25", "1.50", "1.75", "2.00" }; String[] shearValues = { "0.00", "0.25", "0.50", "0.75", "1.00" }; public AffineTransformApp() { super(); Container container = getContentPane(); displayPanel = new DisplayPanel(); container.add(displayPanel); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2, 4, 5, 5)); scaleXval = new JComboBox(scaleValues); scaleXval.setSelectedItem("1.00"); scaleXval.addActionListener(new ComboBoxListener()); scaleYval = new JComboBox(scaleValues); scaleYval.setSelectedItem("1.00"); scaleYval.addActionListener(new ComboBoxListener()); shearXval = new JComboBox(shearValues); shearXval.setSelectedItem("0.00"); shearXval.addActionListener(new ComboBoxListener()); shearYval = new JComboBox(shearValues); shearYval.setSelectedItem("0.00"); shearYval.addActionListener(new ComboBoxListener()); panel.add(new JLabel("Scale X value:")); panel.add(scaleXval); panel.add(new JLabel("Scale Y value:")); panel.add(scaleYval); panel.add(new JLabel("Shear X value:")); panel.add(shearXval); panel.add(new JLabel("Shear Y value:")); panel.add(shearYval); container.add(BorderLayout.SOUTH, panel); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10); setVisible(true); } public static void main(String arg[]) { new AffineTransformApp(); } class ComboBoxListener implements ActionListener { public void actionPerformed(ActionEvent e) { JComboBox temp = (JComboBox) e.getSource(); if (temp == scaleXval) { displayPanel.scalex = Double.parseDouble((String) temp.getSelectedItem()); displayPanel.applyValue(true, false); displayPanel.applyFilter(); displayPanel.repaint(); } else if (temp == scaleYval) { displayPanel.scaley = Double.parseDouble((String) temp.getSelectedItem()); displayPanel.applyValue(true, false); displayPanel.applyFilter(); displayPanel.repaint(); } else if (temp == shearXval) { displayPanel.shearx = Double.parseDouble((String) temp.getSelectedItem()); displayPanel.applyValue(false, true); displayPanel.applyFilter(); displayPanel.repaint(); } else if (temp == shearYval) { displayPanel.sheary = Double.parseDouble((String) temp.getSelectedItem()); displayPanel.applyValue(false, true); displayPanel.applyFilter(); displayPanel.repaint(); } } } } class DisplayPanel extends JLabel { Image displayImage; BufferedImage biSrc, biDest; BufferedImage bi; Graphics2D big; AffineTransform transform; double scalex = 1.0; double scaley = 1.0; double shearx = 1.0; double sheary = 1.0; DisplayPanel() { setBackground(Color.black); loadImage(); setSize(displayImage.getWidth(this), displayImage.getWidth(this)); // panel createBufferedImages(); transform = new AffineTransform(); } public void loadImage() { displayImage = Toolkit.getDefaultToolkit().getImage("largeJava2sLogo.jpg"); MediaTracker mt = new MediaTracker(this); mt.addImage(displayImage, 1); try { mt.waitForAll(); } catch (Exception e) { System.out.println("Exception while loading."); } if (displayImage.getWidth(this) == -1) { System.out.println(" Missing .jpg file"); System.exit(0); } } public void createBufferedImages() { biSrc = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this), BufferedImage.TYPE_INT_RGB); big = biSrc.createGraphics(); big.drawImage(displayImage, 0, 0, this); bi = biSrc; biDest = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this), BufferedImage.TYPE_INT_RGB); } public void applyValue(boolean scale, boolean shear) { if (scale) { transform.setToScale(scalex, scaley); scale = false; } else if (shear) { transform.setToShear(shearx, sheary); shear = false; } } public void applyFilter() { AffineTransformOp op = new AffineTransformOp(transform, null); Graphics2D biDestG2D = biDest.createGraphics(); biDestG2D.clearRect(0, 0, biDest.getWidth(this), biDest.getHeight(this)); op.filter(biSrc, biDest); bi = biDest; } public void reset() { big.setColor(Color.black); big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this)); big.drawImage(displayImage, 0, 0, this); } public void update(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); paintComponent(g); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; g2D.drawImage(bi, 0, 0, this); } }