高产赛母猪

  其实就是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删掉就行了。

你可能感兴趣的:(高产赛母猪)