高产赛母猪

  其实就是GUI练手。

  图片阅读器,超简单版。

  下JAR点我

  要用Graphics类在面板上绘图,这个面板得继承JPanel,然后重写paintComponent(Graphics g)方法,里边就用g来各种draw各种玩弄。

  比如drawImage(img, x, y, observer)第四个参数指的是画图位置,当然用this就可以了。

  observer前面多几个参数的话还可以指定绘图的范围,目测是直接缩放。

  然后还用了下各种Menu,记得,JMenuItem是最小的,是单个菜单选项,JMenu第二小,是单个菜单,比如文件啊编辑啊关于啊。JMenuBar最大,是整个菜单栏。

  菜单定义好了之后使用JFrame的方法,setMenuBar(JMenuBar menu),就搞定了。

 

  不过因为不知道怎么获取菜单栏的高度,加上Win7的窗口好像本来就有点问题,图片画不全,会有一部分看不到哦草我突然想起来忘了设Resizable,懒得重新打包了。

  于是就用了一个非常蠢的方法,对你没有猜错,现在打进电话我就告诉你我给宽度加了16,高度加了59。这个想不到该怎么解决,之后有缘再改吧。

 

  另外还用了下FileFilter类,这个类比较麻烦,得继承它,然后重写accept和getDescription两个方法,第一个接收文件返回布尔值,第二个返回字符串。下边分开说。

  accept方法作用是限制JFileChooser能接受的文件类型,写法是分别判断,想用的比如.jpg文件就返回true,不想显示的比如.txt文件就返回false,另外一定注意,要判断一下file是不是目录,如果是目录的话也要返回true,否则就看不到目录了。

  getDescription方法返回值是下边文件类型框里的文字,比如“所有文件”什么的,主要是给用户看的啦。

 

  发文前我又测试了一下,发现框架这次又太大了不知道怎么回事,反正把蠢方法的宽高都减了10,这回能看了。

  1 package imageViewer;
  2 
  3 import java.awt.Color;
  4 import java.awt.event.ActionListener;
  5 import java.awt.event.ActionEvent;
  6 import java.awt.Graphics;
  7 import java.awt.Image;
  8 
  9 import javax.swing.ImageIcon;
 10 import javax.swing.JFrame;
 11 import javax.swing.JPanel;
 12 import javax.swing.JMenuItem;
 13 import javax.swing.JMenu;
 14 import javax.swing.JMenuBar;
 15 import javax.swing.JFileChooser;
 16 import javax.swing.filechooser.FileFilter;
 17 
 18 import java.io.File;
 19 
 20 @SuppressWarnings("serial")
 21 public class MainFrame extends JFrame{
 22     private MyPanel panel;
 23     
 24     public MainFrame() {
 25         //初始化菜单栏。
 26         JMenuItem openOption = new JMenuItem("打开");
 27         JMenuItem exitOption = new JMenuItem("退出");
 28         
 29         openOption.addActionListener(new OpenListener(this));
 30         exitOption.addActionListener(new ExitListener());
 31         
 32         JMenu menu = new JMenu("文件");
 33         menu.add(openOption);
 34         menu.add(exitOption);
 35         
 36         JMenuBar menuBar = new JMenuBar();
 37         menuBar.add(menu);
 38         
 39         //初始化绘图面板。
 40         panel = new MyPanel();
 41         panel.setBackground(new Color(66, 204, 255));
 42         
 43         this.add(panel);
 44         this.setJMenuBar(menuBar);
 45         
 46         this.setResizable(false);
 47     }
 48     
 49     public MyPanel getPanel() {return this.panel;}
 50 }
 51 
 52 /** 自定义绘图面板。*/
 53 class MyPanel extends JPanel {
 54     private static final long serialVersionUID = 287940773057884149L;
 55     Image img;
 56     
 57     protected void paintComponent(Graphics g) {
 58         g.drawImage(img, 0, 0, this);
 59     }
 60     
 61     public void setImage(Image img) {this.img = img;}
 62 }
 63 
 64 /**“打开”菜单项的事件监听器。*/
 65 class OpenListener implements ActionListener {
 66     MainFrame parent;
 67     
 68     OpenListener(MainFrame parent) {this.parent = parent;}
 69     
 70     public void actionPerformed(ActionEvent e) {
 71         Image img;
 72         if ((img = getImage()) != null) {
 73             parent.getPanel().setImage(img);
 74             parent.getPanel().repaint();
 75             parent.setSize(img.getWidth(parent)+6, img.getHeight(parent)+49);
 76         } else {
 77             return;
 78         }
 79     }
 80     
 81     /**提示并获取文件,然后返回它。*/
 82     private File getFile() {
 83         JFileChooser fileChooser = new JFileChooser();
 84         fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
 85         fileChooser.setMultiSelectionEnabled(false);
 86         fileChooser.setCurrentDirectory(new File("."));
 87         fileChooser.setFileFilter(new MyFilter());
 88         fileChooser.setFileHidingEnabled(true);
 89         if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION)
 90             return fileChooser.getSelectedFile();
 91         else
 92             return null;
 93     }
 94     
 95     /**利用getFile方法来读取文件内容并返回作为内容的图片。为了健壮性本来应该判断一下文件类型的,不过反正自己用就算了。*/
 96     private Image getImage() {
 97         File file = getFile();
 98         if (file == null)
 99             return null;
100         else
101             return new ImageIcon(file.getPath()).getImage();
102     }
103     
104     /**文件类型过滤器,外边用不着,就写成内部类。*/
105     class MyFilter extends FileFilter {
106         @Override
107         public boolean accept(File f) {
108             return (f.isDirectory() ||
109                     f.getName().endsWith(".jpg") ||
110                     f.getName().endsWith(".gif") ||
111                     f.getName().endsWith(".png"));
112         }
113         
114         @Override
115         public String getDescription() {
116             return ".jpg|.gif|.png";
117         }
118     }
119 }
120 
121 /**“退出”菜单项的事件监听器。*/
122 class ExitListener implements ActionListener {
123     public void actionPerformed(ActionEvent e) {
124         System.exit(0);
125     }
126 }
框架和监听器
 1 package imageViewer;
 2 
 3 import javax.swing.JFrame;
 4 import javax.swing.UIManager;
 5 import javax.swing.UnsupportedLookAndFeelException;
 6 
 7 public class Run {
 8     public static void main(String[] args) {
 9         //设置窗口风格。
10         try {
11             UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
12         } catch (UnsupportedLookAndFeelException ule) {
13             ule.printStackTrace();
14         } catch (IllegalAccessException iae) {
15             iae.printStackTrace();
16         } catch (InstantiationException ie) {
17             ie.printStackTrace();
18         } catch (ClassNotFoundException cnfe) {
19             cnfe.printStackTrace();
20         }
21         
22         //新建窗口并设置框架属性。
23         MainFrame frame = new MainFrame();
24         frame.setTitle("简易图片阅读器");
25         frame.setSize(400, 400);
26         frame.setLocationRelativeTo(null);
27         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
28         frame.setVisible(true);
29     }
30 }
运行类

 

  对了,为了提醒某个看得起我真的拿我的代码去用了的人,我的java文件头上有package行,得放进相应的文件夹里,如果要单独拿出class文件来用的话把文件里的package XXXX删掉就行了。

posted @ 2014-01-02 00:40  Chihane  阅读(716)  评论(0编辑  收藏  举报