* 我做的壹個圖片查看器,滾輪和ctrl+↑↓調整大小。
*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;
public class ScaleImageTest extends JFrame {
public ScaleImageTest() {
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(500, 400);
open = new JButton("OPEN");
open.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser(".");
chooser.setMultiSelectionEnabled(false);
chooser.addChoosableFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
if (f.isDirectory())
return true;
String name = f.getName().toLowerCase();
if (name.endsWith(".jpg") || name.endsWith(".bmp")
|| name.endsWith(".png")
|| name.endsWith(".gif")
|| name.endsWith(".ico")
|| name.endsWith(".jpeg"))
return true;
return false;
}
@Override
public String getDescription() {
return "圖像文件";
}
});
chooser.showOpenDialog(ScaleImageTest.this);
File file = chooser.getSelectedFile();
if(file==null)
return;
Image image = Toolkit.getDefaultToolkit().getImage(
file.getPath());
panel.setImage(image);
}
});
panel = new ScaleImagePanel(null, 1);
this.add(panel, BorderLayout.CENTER);
this.add(open, BorderLayout.SOUTH);
addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
boolean ctrlDown = e.isControlDown();
double inc = 0;
if (ctrlDown && code == KeyEvent.VK_UP) {
inc = INC;
} else if (ctrlDown && code == KeyEvent.VK_DOWN) {
inc = -INC;
} else {
return;
}
double newpro = panel.getProportion() + inc;
if (newpro < ScaleImagePanel.MIN_PRO
|| newpro > ScaleImagePanel.MAX_PRO)
return;
panel.setProportion(newpro);
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
this.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int rotation = e.getWheelRotation();
double newpro = panel.getProportion() + INC * rotation;
if (newpro < ScaleImagePanel.MIN_PRO
|| newpro > ScaleImagePanel.MAX_PRO)
return;
panel.setProportion(newpro);
}
});
}
private static final double INC = 0.25;
private ScaleImagePanel panel;
private JButton open;
public static final class ScaleImagePanel extends JComponent {
public ScaleImagePanel(Image image, int proportion) {
this.setImage(image);
this.setProportion(proportion);
}
public double getProportion() {
return proportion;
}
public void setProportion(double proportion) {
if (proportion < MIN_PRO || proportion > MAX_PRO)
throw new IllegalArgumentException("Proportion must be in [ "
+ MIN_PRO + ", " + MAX_PRO + "]");
this.proportion = proportion;
this.validate();
this.repaint();
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
this.validate();
this.repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension((int) (image.getWidth(this) * proportion),
(int) (image.getHeight(this) * proportion));
}
@Override
protected void paintComponent(Graphics g) {
if (image == null)
return;
Dimension size = getSize();
Dimension presize = getPreferredSize();
int x = (size.width - presize.width) / 2;
int y = (size.height - presize.height) / 2;
g.drawImage(image, x, y, presize.width, presize.height, this);
}
private double proportion = 1;
private Image image;
private static final double MAX_PRO = 8;
private static final double MIN_PRO = 0.25;
}
/**
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new ScaleImageTest().setVisible(true);
}
});
}
}