您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > java-swing编程(一个简单的图片查看器)
图1图2图3图4图5图6怎么样,javaswing可视化编程。适合对javaswing有所了解的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里,加入菜单栏,各种监听器。PartI写主面板类——MainPanel可以从JPanel继承。MainPanel相对与JPanel,多了一个图像显示的功能,所以里面一定要有获取图片的方法,还必须重载paintComponent方法。关于paintComponent这我想多说一点。可视化组件要完成显示的工作一般都要调用paint方法,而paint方法又把绘图任务交给了三个方法:paintComponent,paintBorder,和paintChildren。我们只需把需要个性定制的实现代码放在paintComponent方法里,在添加你的代码之前记得一定要调用super.paintComponent。在写自己的实现方法前一定要记住给自己留一条退路。什么退路?比如说我们前面提到的关闭文件方法,要实现一定的清理工作,等价于不在原组件里画图。这里我们可以这样实现:@overridepublicvoidpaintComponent(Graphicsg){super.paintComponent(g);/*Customizeyourpaintplanshere.*/if(image!=null){/*假设image就是需要显示的图片*//*yourcodetopainttheimage*/}}一般情况下,我们不能直接调用paint方法,当需要更新显示内容时直接调用repaint。repaint先完成一定的清理工作然后会调用paint,paint又调用paintComponent,就可以显示出你画的东西了。要让MainPanel类获取图片,可以给它传一个ImageIcon,或图片文件或其它任何可以得到图片的东西。我们从JFileChooser中得到的是图片文件,直接把图片文件或者经转化为ImageIcon后作为参数传递给MainPanel。具体如下:/*MainPanel.java*//*importeveryclassneededhere*/publicclassMainPanelextendsJPanel{protectedFileimgFile;protectedImageIconimg;publicPaintImage(){/*addyourcodehere*/}publicvoidsetImageFile(FilenewImgFile){imgFile=newImgFile;ImageIconnewImg=newImageIcon(imgFile.getPath());setImage(newImg);}publicvoidsetImage(ImageIconnewImg){img=newImg;repaint();}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);if(img!=null){Util.paintImg(this,g,img);/*paintImg是类Util里的一个方法,用来画img*/}}}上述我们已经完成了MainPanel类的创建。下面写一个测试类,看看效果:/*MainPanelTest.java*//*importneededclasseshere*/publicclassMainPanelTest{privatestaticfinalImageIconpigImg=newImageIcon(“imgs/Pig.gif”);publicMainPanelTest(MainPanelmp){JPanelpanel=newJPanel();JButtonbtn=newJButton(“Loadimage”);panel.setLayout(newBorderLayout());mp.setPreferredSize(newDimension(350,350));panel.add(mp);btn.addActionListener(newActionListener(){publicvoidactionPerformed(ActioneEvente){mp.setImage(pigImg);}});panel.add(btn);Util.run(this,null);}publicstaticvoidmain(String[]args){newMainPanelTest(newMainPanel());}}运行时点击按钮即可载入图片。这里再一次地用到了Util类,有关Util请参考Util.java。PartII创建右侧面板类——SlidePaneSlidePane的显示内容是一个列表,我们可以从JList继承。JList通过ListSelectionModel可以设置三种选择模式:MULTIPLE_INTERVAL_SELECTION,SINGLE_INTERVAL_SELECTION,SINGLE_SELECTION。由于每次mainPanel里只能显示一张图片,故我们把它设置成单选模式(SINGLE_SELECTION)。getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);JList中每个元素的显示方式通过ListCellRenderer来管理。我们想要改变它的显示方式,变成显示图标,我们就必须通过设置ListCellRenderer来实现。ListCellRenderer是一个接口,里面只有一个方法:ComponentgetListCellRendererComponent(JList?extendsElist,Evalue,intindex,booleanisSelected,booleancellHasFocus)list是JList中所要显示的元素,value是当前选择的元素,index是当前选择元素的序号。我们可以选择JLabel来实现这个方法,让list里放ImageIcon,然后把label的图标设置成value就可以了。如:publicclassImageRendererextendsJLabelimplementsListCellRenderer{publicImageRenderer(){setOpaque(true);setHorizontalAlignment(SwingConstants.CENTER);setVerticalAlignment(SwingConstants.CENTER);}publicComponentgetListCellRendererComponent(JList?extendsElist,Evalue,intindex,booleanisSelected,booleancellHasFocus){if(isSelected){setBackground(list.getSelectionBackground());setForeground(list.getSelectionForeground());}else{setBackground(list.getBackground());setForeground(list.getForeground());}setIcon(value);returnthis;}}最后要出现滑动条的效果还需要把SlidePane加到JSlidePane里,不需要设置SlidePane的大小,否则SlidePane的可视区域就局限于设置的大小里,超出部分不能通过滚动滑动条看到。PartIII创建BasePanel类这里我们稍稍做一点改动,让按钮和面板标签中的显示内容想关联,让按钮来实现数组index的移动。下面给出代码:/*BasePanel.java*//*importneededclasseshere*/publicclassBasePanelextendsJPanel{JButtonlast;JButtonnext;privateJLabelprogress;privateintindex;privateintlength;publicBasePanel(){setLayout(newFlowLayout());setBorder(newMatteBorder(1,0,0,0,Color.black));last=newJButton(“上一个”);last.setActionCommand(ActionCommand.LAST_IMG);next=newJButton(“下一个”);next.setActionCommand(ActionCommand.NEXT_IMG);progress=newJLabel(“/”);setPreferredSize(newDimension(600,50));add(last);add(progress);add(next);}publicvoidsetParam(intlength,intindex)throwsIllegalParameterException{if(index0||length0||lengthindex){thrownewIllegalParameterException();}this.length=length;setIndex(index);}publicvoidnext(){setIndex(index+1);}publicvoidlast(){setIndex(index-1);}publicintgetIndex(){returnindex;}publicvoidsetIndex(intindex){this.index=index;if(index=0){last.setEnabled(false);}else{last.setEnabled(true);}if(index=length-1){next.setEnabled(false);}else{next.setEnabled(true);}if(index==0&&length==0){progress.setText(“/”);}else{progress.setText((index+1)+”/”+length);}}}两个button的监听器在这里暂时不加,因为BasePanel、SlidePane和MainPanel三者之间要互相通信,在这里增加监听
本文标题:java-swing编程(一个简单的图片查看器)
链接地址:https://www.777doc.com/doc-4499018 .html