java-swing编程(一个简单的图片查看器)
- 格式:doc
- 大小:365.50 KB
- 文档页数:14
图1
图2
图3
图4
图5
图6
怎么样,java swing可视化编程。适合对java swing有所了解的java爱好者。如果有兴趣
就继续往下看,别见笑!
包含的内容:
1. 整个窗口为一个JFrame。
2. 最上方的JMenuBar。
3. 中间最大的那块区域——mainPanel。
4. 右侧边栏——rightPanel。
5. 底部的一栏——basePanel。
主要功能:
JMenuBar里设置了两个菜单项——File和Help。File里有打开文件、关闭文件和退出菜单项。单击Open...或者按快捷键alt+O,弹出JFileChooser文件选择对话框,选择图片文件(这里支持jpg、jpeg、gif、tif、tiff和png五种格式)后,图片将在mainPanel里显示。同一文件夹下的其他图片文件显示在rightPanel,如果图片很多可以出现滑动条。basePanel 里有两个按钮和一个显示当前图片序号和图片总数的标签;按钮可以往上往下翻图片,主面板、右侧边栏和标签都会动态更新。如果到了最后一张,“下一个”按钮被禁用;第一张时,“上一个”被禁用。同理在右侧边栏里选图片其它地方也都可以动态更新。
点File里的Close时,会清空mainPanel,rightPanel和标签中显示的内容,禁用两个按钮,效果(如图1)就像是还没有打开文件一样。
点退出时关闭Frame,结束程序。
下面正式开始介绍程序。
注:这里所讲的和提供的源码稍有差异,有兴趣的可以结合文中给出的代码去编写自己的类。
程序分为四部分,分别为三个面板的建立。最后组合在一起,放在一个JFrame里,加入菜单栏,各种监听器。
Part I 写主面板类——MainPanel
可以从JPanel继承。MainPanel相对与JPanel,多了一个图像显示的功能,所以里面一定要有获取图片的方法,还必须重载paintComponent方法。
关于paintComponent这我想多说一点。可视化组件要完成显示的工作一般都要调用paint 方法,而paint方法又把绘图任务交给了三个方法:paintComponent,paintBorder,和paintChildren。我们只需把需要个性定制的实现代码放在paintComponent方法里,在添加你的代码之前记得一定要调用super.paintComponent。在写自己的实现方法前一定要记住给自己留一条退路。什么退路?比如说我们前面提到的关闭文件方法,要实现一定的清理工作,等价于不在原组件里画图。这里我们可以这样实现:
@override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
/*Customize your paint plans here.*/
if(image!=null){ /*假设image就是需要显示的图片*/
/*your code to paint the image*/
}
}
一般情况下,我们不能直接调用paint方法,当需要更新显示内容时直接调用repaint。repaint 先完成一定的清理工作然后会调用paint,paint又调用paintComponent,就可以显示出你画的东西了。
要让MainPanel类获取图片,可以给它传一个ImageIcon,或图片文件或其它任何可以得到图片的东西。我们从JFileChooser中得到的是图片文件,直接把图片文件或者经转化为ImageIcon后作为参数传递给MainPanel。具体如下:
/*MainPanel.java*/
/*import every class needed here*/
public class MainPanel extends JPanel
{
protected File imgFile;
protected ImageIcon img;
public PaintImage()
{
/*add your code here*/
}
public void setImageFile(File newImgFile)
{
imgFile = newImgFile;
ImageIcon newImg = new ImageIcon(imgFile.getPath());
setImage(newImg);
}
public void setImage(ImageIcon newImg)
{
img = newImg;
repaint();
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(img!=null){
Util.paintImg(this, g, img); /*paintImg 是类Util里的一个方法,用来画img*/ }
}
}
上述我们已经完成了MainPanel类的创建。下面写一个测试类,看看效果:
/*MainPanelTest.java*/
/*import needed classes here*/
public class MainPanelTest
{
private static final ImageIcon pigImg = new ImageIcon(“imgs/Pig.gif”);
public MainPanelTest(MainPanel mp)
{
JPanel panel = new JPanel();
JButton btn = new JButton(“Load image”);
panel.setLayout(new BorderLayout());
mp.setPreferredSize(new Dimension(350,350));
panel.add(mp);
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActioneEvent e){
mp.setImage(pigImg);
}
});
panel.add(btn);
Util.run(this, null);
}
public static void main(String[] args)
{
new MainPanelTest(new MainPanel());
}
}
运行时点击按钮即可载入图片。这里再一次地用到了Util类,有关Util请参考Util.java。Part II 创建右侧面板类——SlidePane
SlidePane的显示内容是一个列表,我们可以从JList继承。JList通过ListSelectionModel