Swing的JPanel是GUI编程中最重要的一个组件,我们可以通过重写JPanel的paintComponent 方法实现对JPanel的背景颜色、背景图片的的调整及设置。
只需要完成下面几个步骤:
public class MyJPanel extends JPanel {
}
@Override
protected void paintComponent(Graphics g) {
}
设置画笔并完成绘制,我们将使用Java2D中的图形绘制引擎(画笔),因为它具有功能更加丰富的图形库,Java 2D支持3种不同的画笔填充策略:
//1.单一颜色背景填充
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.BLUE);
Area area = new Area(new Rectangle2D.Double(0,0,400,300));
g2.fill(area);
//2.线性渐变颜色填充
//2.1 水平方向渐变颜色填充
Color secondColor = new Color(99,153,255);
GradientPaint hLinePaint = new GradientPaint(0,0,Color.BLACK,this.getWidth(),0,secondColor);
g2.setPaint(hLinePaint);
Area area = new Area(new Rectangle2D.Double(0,0,400,300));
g2.fill(area);
//2.2 垂直方向渐变颜色填充
Color controlColor = new Color(99,153,255);
GradientPaint vLinePaint = new GradientPaint(0,0,Color.BLACK,this.getHeight(),0,secondColor);
g2.setPaint(vLinePaint);
Area area = new Area(new Rectangle2D.Double(0,0,400,300));
g2.fill(area);
//3.圆周径向渐变颜色填充
float cx = this.getWidth();
float cy = this.getHeight();
float radius = Math.min(cx,cy);
float[] fractions = new float[]{0.1f,0.5f,1.0f};
Color[] colors = new Color[]{Color.RED,Color.GREEN,Color.BLUE};
RadialGradientPaint rgp = new RadialGradientPaint(cx,cy,radius,fractions,colors, MultipleGradientPaint.CycleMethod.NO_CYCLE);
g2.setPaint(rgp);
Area area = new Area(new Rectangle2D.Double(0,0,400,300));
g2.fill(area);
//使用本地图片-下面drawImage的最后一个参数可使用 null
ImageIcon icon = null;
//icon = new ImageIcon("D:\\bg.jpg");
//使用网络图片
try {
//使用网络图片时,通常不需要设置ImagObserver参数,因为ImageIcon已经默认处理了网络图片的加载
icon = new ImageIcon(new URL("https://img-home.csdnimg.cn/images/20230329030133.jpg"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
Image image = icon.getImage();
super.paintComponent(g2);
//this 会等待图片加载完成并通知ImageObserver对象,在图像完全加载后绘制
//null 不等待图像加载完毕,直接绘制到界面上。加载快但是可能会出现加载不完全的情况
g2.drawImage(image,0,0,this.getWidth(),this.getHeight(),this);
ImageObserver参数是一个回调,用于通知您绘制操作的进度;并且仅在异步获取Image参数时才有用。
基本上,如果您使用的是内存Image(从文件系统加载或由程序构造),则不必担心ImageObserver参数(设置为null也可以)。如果要通过网络加载Image,而不显式等待它们加载,则需要使用ImageObserver以确保"完全"绘制Image。