⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imgpane.java

📁 java看图软件 加入窗口模式 点击无图区实现窗口化
💻 JAVA
字号:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import java.util.ArrayList;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import javax.swing.JPanel;

public class ImgPane extends JPanel
{
	private static final long serialVersionUID = -656634678891L;
	private Image bg,onbg,shade,img,open,close;
	private Graphics2D g2d;
	private int W,H;
	private int imgX,imgY,imgW,imgH;
	private int centerX,centerY;
	private int mpaX,mpaY;
	private int d,td;
	private String path="/img/a.gif";
	
	public ImgPane(int w,int h)
	{
		W=w;
    	H=h;
    	
    	Initimg(path,W,H);
    	
		try {
	        bg = new Robot( ).createScreenCapture(new Rectangle(0,0,W, H));
	    } catch (Exception ex) {}
	    onbg=Toolkit.getDefaultToolkit().getImage(getClass().getResource("/img/onbg.png"));
		shade=Toolkit.getDefaultToolkit().getImage(getClass().getResource("/img/shade.png"));
		close=Toolkit.getDefaultToolkit().getImage(getClass().getResource("/img/close.png"));
		open=Toolkit.getDefaultToolkit().getImage(getClass().getResource("/img/open.png"));
		
		setBackground(Color.GRAY);
		
		MouLis ml=new MouLis();
		addMouseListener(ml);
		MouMoLis mml=new MouMoLis();
		addMouseMotionListener(mml);
		MouWheLis mwl=new MouWheLis();
		addMouseWheelListener(mwl);
	}
	
	private void Initimg(String path,int w,int h)
	{
		d=0;
		td=0;
		if(path.endsWith("bmp"))
		{
			img=BMPLoader.load(path);
		}
		else
		{
			if(path.contains(":"))
				img=Toolkit.getDefaultToolkit().getImage((path));
			else
				img=Toolkit.getDefaultToolkit().getImage(getClass().getResource((path)));
			MediaTracker mt=new MediaTracker(this);
			mt.addImage(img,1);
			try{
			   mt.waitForAll();
			  }catch(Exception e)
			 {
				  JOptionPane.showMessageDialog(getRootPane(), "Exception while loading picture\nprogram will exit", "Failed", JOptionPane.ERROR_MESSAGE);
				  System.exit(0);
			 }
		}
		if(img.getWidth(null)==-1)
		{
			  JOptionPane.showMessageDialog(getRootPane(), "Exception while loading picture\nprogram will exit", "Failed", JOptionPane.ERROR_MESSAGE);
			  System.exit(0);
		}    
		imgW=img.getWidth(null);
		imgH=img.getHeight(null);
		if(imgW>W*0.8||imgH>H*0.8)
		{
			if(imgW*1.0/imgH<W*1.0/H)
			{
				imgW=(int)(W*0.8);
				imgH=(int)(imgW*img.getHeight(null)*1.0/img.getWidth(null));
			}
			else
			{
				imgH=(int)(H*0.8);
				imgW=(int)(imgH*img.getWidth(null)*1.0/img.getHeight(null));
			}
			td=(int) ((Math.log(img.getWidth(null))-Math.log(imgW))/Math.log(1.08));
		}
		imgX=(W-imgW)/2;
		imgY=(H-imgH)/2;
		centerX=W/2;
		centerY=H/2;
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g2d=(Graphics2D)g;
		g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g2d.setFont(new Font("微软雅黑",0,22));
		g2d.setColor(Color.GREEN);
		
		int sX,sY,sW,sH;
		double x=imgW/212.0,y=imgH/212.0;
		sW=(int)(240*x*1.013);
		sH=(int)(240*y);
		sX=(int)(imgX-11*x);
		sY=(int)(imgY-11*y);
		g2d.drawImage(bg, 0, 0, this);
		g2d.drawImage(onbg, 0, 0, W, H, this);
		g2d.drawImage(shade,sX ,sY,sW,sH,this);
		g2d.drawImage(img,imgX ,imgY,imgW,imgH,this);
		g2d.drawImage(open,0 ,0,this);
		g2d.drawImage(close,W-40 ,0,this);
		g2d.drawString(""+(int)(imgW*100.0/img.getWidth(null))+"%"+"   "+imgW+"×"+imgH, W/2-60, 30);
		g2d.drawString(new File(path).getName(),W/2-20,H-70);
	}
	
	private class MouLis implements MouseListener
	{
		public void mouseClicked(MouseEvent e) 
		{
			if((W-e.getX())*(W-e.getX())+e.getY()*e.getY()<1600)
					System.exit(0);
			else if(e.getX()*e.getX()+e.getY()*e.getY()<1600)
			{
				JFileChooser chooser=new JFileChooser();
			    chooser.setCurrentDirectory(new File(path));
			    ExtensionFileFilter filter=new ExtensionFileFilter();
			    filter.addExtension("jpg");
			    filter.addExtension("jpeg");
			    filter.addExtension("gif");
			    filter.addExtension("bmp");
			    filter.addExtension("png");
			    filter.setdescription("Image Files");
			    chooser.setFileFilter(filter);
			    int result=chooser.showOpenDialog(getRootPane());
			    if(result==JFileChooser.APPROVE_OPTION)
			    {
				    path= chooser.getSelectedFile().getPath();
			    	Initimg(path,W,H);
				    repaint();
			    }
			}
			else if(e.getClickCount()==2)	
			{
				if(e.getX()>=imgX&&e.getX()<=imgX+imgW&&e.getY()>=imgY&&e.getY()<=imgY+imgH)
				{
					Initimg(path,W,H);
					repaint();
				}
			}
		}
		public void mouseEntered(MouseEvent e) {}
		public void mouseExited(MouseEvent e) {}
		public void mousePressed(MouseEvent e) 
		{
			mpaX=e.getX();
			mpaY=e.getY();
			if(mpaX>=imgX&&mpaX<=imgX+imgW&&mpaY>=imgY&&mpaY<=imgY+imgH)
				getRootPane().setCursor(new Cursor(Cursor.MOVE_CURSOR));
		}
		
		public void mouseReleased(MouseEvent e) 
		{
			getRootPane().setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		}
		
		private  class ExtensionFileFilter extends FileFilter
		{
			private String description="";
			private ArrayList<String> extensions=new ArrayList<String>();
			public void addExtension(String extension)
			 {
				  if(!extension.startsWith("."))
				  extension="."+extension;
				  extensions.add(extension.toLowerCase());
			 }

			 public void setdescription(String aDescription)
			 {
				 description=aDescription;
			 }
			 
			 public String getDescription()
			 {
				 return description;
			 }
			 
			 public boolean accept(File f)
			 {
				  if(f.isDirectory())
					  return true;
				  String name=f.getName().toLowerCase();
				  for(int i=0;i<extensions.size();i++)
					  if(name.endsWith((String)extensions.get(i)))
						  return true;
				  return false;
			 }
		}
	}
	
	private class MouMoLis implements MouseMotionListener
	{
		public void mouseDragged(MouseEvent e) 
		{
			if(e.getX()<imgX||e.getX()>imgX+imgW||e.getY()<imgY||e.getY()>imgY+imgH)
				return;
			imgX+=e.getX()-mpaX;
			imgY+=e.getY()-mpaY;
			centerX+=e.getX()-mpaX;
			centerY+=e.getY()-mpaY;
			mpaX=e.getX();
			mpaY=e.getY();
			repaint();
		}
		
		public void mouseMoved(MouseEvent e) 
		{
			if(((W-e.getX())*(W - e.getX()) + e.getY()*e.getY() < 1600) || (e.getX()*e.getX() + e.getY()*e.getY()<1600))
				getRootPane().setCursor(new Cursor(Cursor.HAND_CURSOR));
			else
				getRootPane().setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		}
	}
	
	private class MouWheLis implements MouseWheelListener
	{
		public void mouseWheelMoved(MouseWheelEvent e) 
		{
			d = e.getWheelRotation();
			td += d;
			double multiple = 1;
			int abstd=Math.abs(td);
			double temp = Math.pow(1.08, abstd);
			if(td<0)
				multiple *= temp;
			else
				multiple /= temp;
			imgW = (int)(img.getWidth(null)*multiple );
			imgH = imgW*img.getHeight(null) / img.getWidth(null);
			imgX = centerX - imgW / 2;
			imgY = centerY - imgH / 2;
			repaint();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -