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 } */ }
评论
所有回答列表(0)
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给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目录是框架带的吗?
相关问答
- 等 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的文件选择器,选择当前目录,然后点击生成文件按钮,当前文件生成,在当前选择目录怎么做?
最近浏览
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日