Swing的JPanel是GUI编程中最重要的一个组件,我们可以通过重写JPanel的paintComponent 方法实现对JPanel的背景颜色、背景图片的的调整及设置。
只需要完成下面几个步骤:
1. 类继承JPanel
public class MyJPanel extends JPanel { }
2. 完成对paintComponent 方法的重写
@Override protected void paintComponent(Graphics g) { }
3. 访问Graphics绘制引擎
设置画笔并完成绘制,我们将使用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);
关于drawImage方法中的ImageOberserver参数
ImageObserver参数是一个回调,用于通知您绘制操作的进度;并且仅在异步获取Image参数时才有用。
基本上,如果您使用的是内存Image(从文件系统加载或由程序构造),则不必担心ImageObserver参数(设置为null也可以)。如果要通过网络加载Image,而不显式等待它们加载,则需要使用ImageObserver以确保"完全"绘制Image。