import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.awt.geom.Line2D; import javax.swing.*; public class SplitImageComponent extends JPanel { private BufferedImage mImage; private BufferedImage mSecondImage; private int mSplitX; public SplitImageComponent(String path) { setImage(path); init(); } public SplitImageComponent(BufferedImage image) { setImage(image); init(); } public void setImage(String path) { Image image = Utilities.blockingLoad(path); mImage = Utilities.makeBufferedImage(image); } public void setImage(BufferedImage image) { mImage = image; } public void setSecondImage(BufferedImage image) { mSecondImage = image; repaint(); } public BufferedImage getImage() { return mImage; } public BufferedImage getSecondImage() { return mSecondImage; } private void init() { setBackground(Color.white); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { mSplitX = me.getX(); repaint(); } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent me) { mSplitX = me.getX(); repaint(); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; int width = getSize().width; int height = getSize().height; // Explicitly clear the window. Rectangle clear = new Rectangle(0, 0, width, height); g2.setPaint(getBackground()); g2.fill(clear); // Clip the first image, if appropriate, // to be on the right side of the split. if (mSplitX != 0 && mSecondImage != null) { Rectangle firstClip = new Rectangle(mSplitX, 0, width - mSplitX, height); g2.setClip(firstClip); } g2.drawImage(getImage(), 0, 0, null); if (mSplitX == 0 || mSecondImage == null) return; Rectangle secondClip = new Rectangle(0, 0, mSplitX, height); g2.setClip(secondClip); g2.drawImage(mSecondImage, 0, 0, null); Line2D splitLine = new Line2D.Float(mSplitX, 0, mSplitX, height); g2.setClip(null); g2.setColor(Color.white); g2.draw(splitLine); } public Dimension getPreferredSize() { int width = getImage().getWidth(); int height = getImage().getHeight(); if (mSecondImage != null) { width = Math.max(width, mSecondImage.getWidth()); height = Math.max(height, mSecondImage.getHeight()); } return new Dimension(width, height); } }