zhengyeshi
2014-12-31 10:07:28
等
java swing为什么不显示图片?
import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; import javax.swing.*; import javax.swing.filechooser.*; import java.io.*; import java.util.logging.Filter; import java.applet.*; public class PicViewer extends JFrame implements ActionListener{ JPanel pathBar,picContainer,ctrBar; JLabel pathInfo; JButton openbtn,prebtn,nextbtn,zoominbtn,zoomoutbtn,oripicbtn,angleleftbtn,anglerightbtn,exitbtn,deletebtn,savebtn; Image pic;//查看图片 BufferedImage bufImage,filteredBufImage;//用于显示缓冲区图像 BufferedImage oriBufImage;//原始缓冲区图像 Graphics2D bufImageG;//缓冲区图像的图像环境 String path,filename,dir;//需要查看图片的路径 String[] pics;//目录下所有指定格式的图片 int picWidth,picHeight;//图片大小 int i = 0; final double ZOOM_PERCENT=0.15;//每次放大和缩小的倍率 final String FILE_TYPE="jpg"; boolean hasPic,isangled; double scaleX;//图像水平方向的缩放因子 double scaleY;//图像垂直方向的缩放因子 double radius;//旋转角度 Filter filterJpg; public PicViewer(){ JFrame frame=new JFrame("tupianchakanqi"); pathBar= new JPanel(); picContainer= new JPanel(); ctrBar= new JPanel(); pathInfo= new JLabel(); frame.add(pathInfo); frame.setBounds(200, 100, 1000, 540); frame.setVisible(true); //顶部路径栏 pathBar.setLayout(new BorderLayout()); pathBar.add(pathInfo); pathBar.setVisible(true); //图片显示区域 picContainer.setBackground(Color.LIGHT_GRAY); picContainer.setVisible(true); //底部控制栏 openbtn= new JButton("打开"); openbtn.addActionListener(this); savebtn = new JButton("保存"); savebtn.addActionListener(this); prebtn= new JButton("上一张"); prebtn.addActionListener(this); nextbtn= new JButton("下一张"); nextbtn.addActionListener(this); zoominbtn= new JButton("放大"); zoominbtn.addActionListener(this); zoomoutbtn= new JButton("缩小"); zoomoutbtn.addActionListener(this); oripicbtn = new JButton("原始图片"); oripicbtn.addActionListener(this); angleleftbtn= new JButton("左旋"); angleleftbtn.addActionListener(this); anglerightbtn= new JButton("右旋"); anglerightbtn.addActionListener(this); deletebtn= new JButton("删除"); deletebtn.addActionListener(this); exitbtn= new JButton("退出"); exitbtn.addActionListener(this); ctrBar.add(openbtn); ctrBar.add(zoominbtn); ctrBar.add(zoomoutbtn); ctrBar.add(oripicbtn); ctrBar.add(prebtn); ctrBar.add(nextbtn); ctrBar.add(angleleftbtn); ctrBar.add(anglerightbtn); ctrBar.add(deletebtn); ctrBar.add(savebtn); ctrBar.add(exitbtn); setLayout(new BorderLayout()); frame.add(ctrBar,BorderLayout.SOUTH); //界面总布局 // frame.add(pathBar,BorderLayout.NORTH); frame.add(picContainer,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ JButton click=(JButton)e.getSource();//获取按键源 if(click==openbtn){ open(); } if(click==prebtn&&pic!=null){ pre(); } if(click==nextbtn&&pic!=null){ next(); } if(click==zoominbtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("放大图片"); zoomin(); } if(click==zoomoutbtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("缩小图片"); zoomout(); } if(click==oripicbtn&&pic!=null){ oripic(); } if(click==angleleftbtn&&pic!=null){ angleleft(); } if(click==anglerightbtn&&pic!=null){ angleright(); } if(click==exitbtn){ exit(); } if(click==deletebtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("删除图片"); delete(); } if(click==savebtn&&pic!=null){ pathInfo.setForeground(Color.BLACK); pathInfo.setText("复制图片"); try{ save(); }catch(Exception ee){} } } //打开需要查看的图片文件 public void open(){ JFileChooser chooser= new JFileChooser(); //只显示文件夹和jpg格式的文件 //建立过滤器 只显示jpg FileNameExtensionFilter filter= new FileNameExtensionFilter("*.JPG","jpg"); chooser.setFileFilter(filter); chooser.setCurrentDirectory(new File("")); Component msg = null; int returnVal=chooser.showOpenDialog(msg); //根据返回值判断是否选择了文件 if(returnVal==JFileChooser.APPROVE_OPTION){ //获取文件名 filename=chooser.getSelectedFile().getName(); //获取文件路径 path=chooser.getCurrentDirectory().getPath(); //获取文件路径下所有jpg文件 PicViewer.Filter filterJpg = new Filter(FILE_TYPE); File file=new File(path); pics=file.list(); pics=file.list(filterJpg); //跟中选中的图片 for(int j=0;j<pics.length;j++) if(pics[j].equalsIgnoreCase(filename)) { i=j; break; } dir=path+"\\"+filename; hasPic=true; loadImage(dir); pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); prebtn.setEnabled(true); nextbtn.setEnabled(true); zoominbtn.setEnabled(true); zoomoutbtn.setEnabled(true); angleleftbtn.setEnabled(true); anglerightbtn.setEnabled(true); oripicbtn.setEnabled(true); deletebtn.setEnabled(true); savebtn.setEnabled(true); } else{ hasPic=false; pathInfo.setForeground(Color.RED); pathInfo.setText("没有选择文件"); } } //保存文件 public void save()throws IOException{ JButton msgsave= new JButton(); JFileChooser chooser= new JFileChooser();//只显示文件夹和jpg格式的文件 FileNameExtensionFilter filter= new FileNameExtensionFilter("*.JPG","jpg");//建立过滤器 chooser.setFileFilter(filter); File fin= new File(path+"\\"+pics[i]); File f= new File(""+"\\"+pics[i]); chooser.setSelectedFile(f); int returnVal=chooser.showSaveDialog(msgsave); //根据返回值判断是否选择了文件路径 if(returnVal==JFileChooser.APPROVE_OPTION){ path=chooser.getCurrentDirectory().getPath();//获取文件路径 File fileout = new File(path+"\\"+chooser.getSelectedFile().getPath()); FileInputStream isr= new FileInputStream(fin); FileOutputStream fout= new FileOutputStream(fileout); byte b[]= new byte[200]; int count= 0; while((count=isr.read(b, 0, 200))!=-1) fout.write(b, 0, count); isr.close(); fout.flush(); fout.close(); } } //上一张 public void pre(){ //循环浏览图片 if(i==0){ i=pics.length-1; } else{ i--; } dir=path+"\\"+pics[i]; pathInfo.setText(dir); hasPic=true; isangled=false; scaleX=1.0; scaleY=1.0; loadImage(dir); oripicbtn.setEnabled(false); } //查看下一张 public void next(){ if(i==pics.length-1){ i=0; }else{ i++; } dir=path+"\\"+pics[i]; pathInfo.setText(dir); hasPic=true; isangled=false; scaleX=1.0; scaleY=1.0; loadImage(dir); oripicbtn.setEnabled(false); } //放大图片 public void zoomin(){ if(scaleX<1.7){ scaleX+=ZOOM_PERCENT; scaleY+=ZOOM_PERCENT; }else{ scaleX=1.8; scaleY=1.8; pathInfo.setForeground(Color.RED); pathInfo.setText("已经放大最大"); } hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(dir); if(scaleX==1){ oripicbtn.setEnabled(false); }else{ oripicbtn.setEnabled(true); } } //缩小图片 public void zoomout(){ if(scaleX>0.8){ scaleX-=ZOOM_PERCENT; scaleY-=ZOOM_PERCENT; }else{ scaleX=0.2; scaleY=0.2; pathInfo.setForeground(Color.RED); pathInfo.setText("已经缩至最小"); } hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(dir); if(scaleX==1){ oripicbtn.setEnabled(false); }else{ oripicbtn.setEnabled(true); } } //回复图片原始状态 public void oripic(){ scaleX=1; scaleY=1; radius=0; hasPic=true; picTrans(); repaint();//重绘组件 pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); oripicbtn.setEnabled(false); } //将图片逆时针旋转 public void angleleft(){ isangled=true; radius+=-Math.PI/2; repaint(); oripicbtn.setEnabled(true); } //将图片顺时针旋转 public void angleright(){ isangled=true; radius+=Math.PI/2;//每次右旋转45度 repaint(); oripicbtn.setEnabled(true); } //删除图片 public void delete(){ File f= new File(path+"\\"+pics[i]); if(f.exists()) f.delete(); else{ pathInfo.setForeground(Color.BLACK); pathInfo.setText("文件不存在"); } for(int j=i;j<pics.length-1;j++) pics[j]=pics[j+1]; if(i==pics.length-1) i=0; dir=path+"\\"+pics[i]; loadImage(dir); } //退出图片查看器 public void exit(){ hasPic=false; System.exit(0); } //加载图像 public void loadImage(String fileName){ pic=this.getToolkit().getImage(fileName);//取得图像 MediaTracker mt= new MediaTracker(this);//实例化媒体加载器,跟踪多种媒体对象状态 mt.addImage(pic, 0);//增加图像到加载器 picWidth=pic.getWidth(this); picHeight=pic.getHeight(this); try{ mt.waitForAll();//等待图片加载 }catch(Exception e){ e.printStackTrace();//输出错误信息 } //创建原始缓冲区图像 oriBufImage = new BufferedImage(pic.getWidth(this),pic.getHeight(this),BufferedImage.TYPE_INT_ARGB); bufImage= oriBufImage; bufImageG = bufImage.createGraphics();//创建bufImage的图形环境 bufImageG.drawImage(pic, 0, 0, this);//传输源图像数据到缓冲区 repaint();//重绘组件 } //图像转换处理 public void picTrans(){ if(bufImage==null) return;//如果bufImage为空则直接返回 //过滤后的图像 BufferedImage fileteredBufImage = new BufferedImage((int)(pic.getWidth(this)*scaleX),(int)(pic.getHeight(this)*scaleY),BufferedImage.TYPE_INT_ARGB); AffineTransform transform= new AffineTransform();//2D放射变换 transform.setToScale(scaleX, scaleY);//设置放射变换的比例因子 AffineTransformOp imageOp = new AffineTransformOp(transform,null);//创建放射变换操作对象 imageOp.filter(oriBufImage, filteredBufImage); bufImage=filteredBufImage; // BufferedImage oriBufImage; // BufferedImage filteredBufImage; imageOp.filter(oriBufImage,filteredBufImage); bufImage=filteredBufImage; } //重写update(),消除闪烁 public void update(Graphics g){ this.paint(g); } //图片绘制 public void paint(Graphics g){ int panelWidth= this.getWidth(); int panelHeight= this.getHeight(); super.paint(g); //判断是否需要旋转图片 if(bufImage!=null &&isangled==true){ Graphics2D g2= (Graphics2D)g; AffineTransform tx= new AffineTransform(); //按照角度,根据中心旋转 tx.rotate(radius,panelWidth/2,panelHeight/2); g2.setTransform(tx); picTrans(); g2.drawImage(bufImage,(panelWidth-bufImage.getWidth())/2,(panelHeight-bufImage.getHeight())/2,this);//绘制图片 pathInfo.setForeground(Color.BLACK); pathInfo.setText(path+"\\"+filename); isangled=false; } else if(bufImage!=null){ Graphics2D g2=(Graphics2D)g; picTrans(); g2.drawImage(bufImage,(panelWidth-bufImage.getWidth())/2,(panelHeight-bufImage.getHeight())/2,this);//绘制图片 } } //文件类型 public class Filter implements FilenameFilter{ String extension; Filter(String extension){ this.extension=extension; } public boolean accept(File directory,String filename){ return filename.endsWith(extension); } } /** * @param args */ public static void main(String args[]) throws Exception{ PicViewer a=new PicViewer(); } /** @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } */ }
评论
![](https://static.zuidaima.com/resource/img/list_ico.png)
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
![](https://static.zuidaima.com/resource/img/heart_ico.png)
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 等 java swing中如何嵌入地图代码?
- 等 java swing新建screen,如何在这个screen里面上传并播放视频?
- 等 JAVA Swing的菜单如何实现图片中的功能?
- 等 java swing中的JFrame如何实现多个界面跳转?
- 等 java swing写游戏入门有什么值得参考的demo?
- 等 eclipse开发Java swing如何实现简单的绘图界面?
- 等 java swing如何通过Jlist连接数据库获取数据并显示?
- 等 Java swing JButton怎么实现对文本的前进,后退功能?
- 等 如何用java swing组件中下拉菜单中多个选项选中存储?
- 等 java swing通过httpclient向服务器端发送post请求如何做?
- 完 java swing的文件选择器,选择当前目录,然后点击生成文件按钮,当前文件生成,在当前选择目录怎么做?
![](https://static.zuidaima.com/resource/img/cattle_ico.png)
WASDZZ LV13
2021年7月10日
1105996655 LV1
2020年10月16日
一口纯真 LV1
2019年7月30日
dddddddddd冬霖 LV2
2019年6月12日
宫商角徵羽
2019年6月10日
暂无贡献等级
jia364511276 LV3
2019年2月28日
张霸膀 LV2
2019年2月15日
asdsad LV1
2017年5月8日
隔壁老王丶
2017年1月9日
暂无贡献等级
herenqing LV1
2016年10月21日