📄 imgpane.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 + -