import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.filechooser.FileNameExtensionFilter;public class PicViewer{
public static void main(String[] args){
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Windows Classic".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Windows is not available, you can set the GUI to another look and feel.
}
EventQueue.invokeLater(new Runnable(){
public void run(){
PicFrame frame = new PicFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}class PicFrame extends JFrame{
public PicFrame(){
setTitle("PicViewer"); Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.getImage(getClass().getResource("icon.png"));
setIconImage(img);
Dimension screenSize = kit.getScreenSize();
setSize(screenSize.width * 5 / 13, screenSize.height * 6 / 13);
JMenuItem openItem = new JMenuItem("打开");
openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
openItem.addActionListener(new OpenFile());
//add menu bar
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("文件");
menuBar.add(fileMenu);
fileMenu.add(openItem);
chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("图象文件(*.JPG;*.JPEG*.GIF;*.PNG;)", "jpg", "jpeg", "gif", "png");
chooser.setFileFilter(filter);
}
private class OpenFile extends AbstractAction{
public void actionPerformed(ActionEvent e) {
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(PicFrame.this);
if(result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
PicComponent component = new PicComponent(name);
add(component, BorderLayout.CENTER );
validate();
}
}
}
class PicComponent extends JComponent{
public PicComponent(String name){
try{
image = ImageIO.read(new File(name));
}
catch (IOException e1){
e1.printStackTrace();
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
int x = (getWidth() - image.getWidth(this)) / 2;
int y = (getHeight() - image.getHeight(this)) / 2;
g2d.drawImage(image, x, y, this);
}
}
private JFileChooser chooser;
private Image image;
}问题是,打开第一张图片,然后放大框架,没有问题。打开第二张图片的时候,然后再放大框架,会在框架中绘制两个一样的图像。
因为想把图像绘制在框架中央,就出现这个问题!
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.filechooser.FileNameExtensionFilter;public class PicViewer{
public static void main(String[] args){
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Windows Classic".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
// If Windows is not available, you can set the GUI to another look and feel.
}
EventQueue.invokeLater(new Runnable(){
public void run(){
PicFrame frame = new PicFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}class PicFrame extends JFrame{
public PicFrame(){
setTitle("PicViewer"); Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.getImage(getClass().getResource("icon.png"));
setIconImage(img);
Dimension screenSize = kit.getScreenSize();
setSize(screenSize.width * 5 / 13, screenSize.height * 6 / 13);
JMenuItem openItem = new JMenuItem("打开");
openItem.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
openItem.addActionListener(new OpenFile());
//add menu bar
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("文件");
menuBar.add(fileMenu);
fileMenu.add(openItem);
chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("图象文件(*.JPG;*.JPEG*.GIF;*.PNG;)", "jpg", "jpeg", "gif", "png");
chooser.setFileFilter(filter);
}
private class OpenFile extends AbstractAction{
public void actionPerformed(ActionEvent e) {
chooser.setCurrentDirectory(new File("."));
int result = chooser.showOpenDialog(PicFrame.this);
if(result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
PicComponent component = new PicComponent(name);
add(component, BorderLayout.CENTER );
validate();
}
}
}
class PicComponent extends JComponent{
public PicComponent(String name){
try{
image = ImageIO.read(new File(name));
}
catch (IOException e1){
e1.printStackTrace();
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
int x = (getWidth() - image.getWidth(this)) / 2;
int y = (getHeight() - image.getHeight(this)) / 2;
g2d.drawImage(image, x, y, this);
}
}
private JFileChooser chooser;
private Image image;
}问题是,打开第一张图片,然后放大框架,没有问题。打开第二张图片的时候,然后再放大框架,会在框架中绘制两个一样的图像。
因为想把图像绘制在框架中央,就出现这个问题!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货