展开全部
import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.io.*;
import java.util.*;
/**
* @author Hardneedl
*/
final class PicDemo extends JFrame {
public String getTitle() {return "PicDemo";}
static private final Dimension size = new Dimension(600,400);
public Dimension getPreferredSize() {return size;}
public Dimension getMaximumSize() {return size;}
public Dimension getMinimumSize() {return size;}
public Dimension getSize(){return size;}
private interface Brush extends Observer{
void paint(Graphics g);
}
private class Canvas extends JComponent{
private Brush b;
private Observable observable=new Observable(){
public void notifyObservers(Object arg) {
setChanged();
super.notifyObservers(arg);
}
};
void setBrush(Brush b){
this.b=b;
observable.deleteObservers();
observable.addObserver(b);
if(isVisible())repaint();
}
private Canvas() {
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
observable.notifyObservers(e.getPoint());
repaint();
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(b!32313133353236313431303231363533e78988e69d8331333332623931=null)b.paint(g);
}
}
private class ImageBrush implements Brush{
private boolean drawTilEnabled;
private Image mainImg,til;
private Point p=new Point();
private void setTil(Image til) {this.til = til;}
private void setMainImg(Image mainImg) {this.mainImg = mainImg;}
public void paint(Graphics g) {
Graphics2D g2= (Graphics2D) g.create();
g2.drawImage(mainImg,0,0,null);
if(drawTilEnabled)
g2.drawImage(til, AffineTransform.getTranslateInstance(p.x-(til.getWidth(null)>>1), p.y-(til.getHeight(null)>>1)),null);
g2.dispose();
}
public void update(Observable o, Object arg) {
if(arg instanceof Point){
drawTilEnabled=true;
p.setLocation((Point) arg);
}
}
}
private Canvas canvas;
PicDemo() throws HeadlessException {
init();
attachListeners();
doLay();
}
private void init(){
canvas=new Canvas();
ImageBrush brush=new ImageBrush();
try {
brush.setMainImg(ImageIO.read(new File("b.png")));
brush.setTil(ImageIO.read(new File("unknown.png")));
} catch (IOException e) {
e.printStackTrace();
}
canvas.setBrush(brush);
}
private void attachListeners(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void doLay(){
final Container container = getContentPane();
container.add(canvas,BorderLayout.CENTER);
pack();
setVisible(true);
}
public static void main(String...args) {
System.setProperty("swing.defaultlaf","com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.invokeLater(
new Runnable(){
public void run() {
new PicDemo();
}
}
);
}
}