package my;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class MyPanel extends JPanel
{
BufferedImage image;
public MyPanel()
{
//加载图片
URL imagePath=getClass().getResource("/images/pobing_05.jpeg");
try {
image=ImageIO.read(imagePath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g)
{
int width=this.getWidth();
int height=this.getHeight();
Graphics2D g2d=(Graphics2D)g;
//设置线型
Stroke stroke=new BasicStroke(10);
g2d.setStroke(stroke);
Color c1=Color.GREEN;
Color c2=Color.RED;
drawLine(g2d,0,0,width,0,c1,c2);
drawLine(g2d,0,0,0,height,c1,c2);
drawLine(g2d,width,height,width,0,c1,c2);
drawLine(g2d,width,height,0,height,c1,c2);
//图片绘制
//计算缩放后的区域
int imgW=image.getWidth();
int imgH=image.getHeight();
JsImageScaler scaler=new JsImageScaler(imgW,imgH,width,height);
Rectangle fit=scaler.fitCenterInside();
//设置clip区域(仅区域内可以绘制)
int size=250;
Shape region=new Ellipse2D.Double((width-size)/2,(height-size)/2,size,size);
g2d.clip(region);
g2d.drawImage(image, fit.x, fit.y, fit.width, fit.height, null);
}
//绘制
private void drawLine(Graphics2D g2d,
int x1,int y1,int x2,int y2,
Color c1,Color c2)
{
//Point2D
Point2D start=new Point2D.Double(x1, y1); //起点
Point2D end=new Point2D.Double(x2, y2); //终点(渐变的方向)
float[] dist= {0.0f,1.0f}; //插入关键点
Color[] colors= {c1,c2}; //关键点的颜色值
Paint paint=new LinearGradientPaint(start,end,dist,colors);
//设置Paint
g2d.setPaint(paint);
//构造一个shape
Shape shape=new Line2D.Double(start, end);
g2d.draw(shape);
}
}
package my;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame
{
public MyFrame(String title)
{
super(title);
//ContentPane
JPanel root=new MyPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
}
}
package my;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MyDemo
{
private static void createGUI()
{
// JFrame指一个窗口,构造方法的参数为窗口标题
JFrame frame = new MyFrame("Swing Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口的其他参数,如窗口大小
frame.setSize(500, 300);
// 显示窗口
frame.setVisible(true);
}
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
createGUI();
}
});
}
}
package my;
import java.awt.Rectangle;
public class JsImageScaler {
// 输入参数
private int imgW,imgH; // 图片的宽度、高度
private Rectangle rect; // 要绘制的目标区域
// imgW, imgH, 图片的宽度/高度
// rect: 目标区域
public JsImageScaler(int imgW, int imgH, Rectangle rect)
{
this.imgW = imgW;
this.imgH = imgH;
this.rect = rect;
}
public JsImageScaler(int imgW, int imgH, int dstW, int dstH)
{
this(imgW, imgH, new Rectangle(dstW, dstH));
}
// 拉伸显示,占满空间(比例可能失调)
public Rectangle fitXY()
{
return this.rect;
}
// 居中显示,保持长宽比,且适合目标矩形
public Rectangle fitCenter()
{
int width = rect.width;
int height = rect.height;
int fitW = width;
int fitH = imgH*width/imgW;
if( fitH > height )
{
fitH = height;
fitW = height * imgW / imgH;
}
int x = (width - fitW ) /2;
int y = (height - fitH ) /2;
// 结果
return new Rectangle(rect.x + x, rect.y + y, fitW, fitH);
}
// 如果图片小于目标矩形,则直接居中显示
// 如果图片大于目标矩形,则按fitCenter()缩放后显示
public Rectangle fitCenterInside()
{
int width = rect.width;
int height = rect.height;
int fitW, fitH;
if(imgW <= width && imgH <= height)
{
fitW = imgW;
fitH = imgH;
int x = (width - fitW ) /2;
int y = (height - fitH ) /2;
return new Rectangle(rect.x + x, rect.y + y, fitW, fitH);
}
else
{
return fitCenter();
}
}
}