【Java数字图像处理之Swing基础篇】自定义JPanel背景

简介: 【Java数字图像处理之Swing基础篇】自定义JPanel背景

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。



相关文章
|
8天前
|
存储 Java 关系型数据库
农产品管理系统【GUI/Swing+MySQL】(Java课设)
农产品管理系统【GUI/Swing+MySQL】(Java课设)
20 1
|
8天前
|
存储 Java 关系型数据库
个人成绩信息管理系统【GUI/Swing+MySQL】(Java课设)
个人成绩信息管理系统【GUI/Swing+MySQL】(Java课设)
22 0
|
8天前
|
存储 Java 关系型数据库
酒店管理系统【GUI/Swing+MySQL】(Java课设)
酒店管理系统【GUI/Swing+MySQL】(Java课设)
25 1
|
8天前
|
Java 关系型数据库 MySQL
基于swing的java物业管理系统
基于swing的java物业管理系统
23 5
|
Java API 计算机视觉
Java数字图像处理基础知识 - 必读
写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的 API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图: 一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等 信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首 先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p newimageformatIO.jar即可。
997 0
|
3天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】 在多核处理器日益普及的今天,并发编程成为了软件开发中不可忽视的重要话题。Java语言提供了丰富的并发工具和机制来帮助开发者构建高效且线程安全的应用程序。本文将探讨Java并发的核心概念,包括线程同步、锁机制、以及如何通过这些工具实现性能优化。我们将透过实例分析,揭示并发编程中的常见问题,并展示如何利用现代Java API来解决这些问题。
|
3天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】在Java并发编程中,线程安全和性能优化是两个关键要素。本文将深入探讨Java并发编程的基本概念、线程安全的实现方法以及性能优化技巧。通过分析同步机制、锁优化、无锁数据结构和并发工具类的使用,我们将了解如何在保证线程安全的前提下,提高程序的性能。
|
3天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第20天】 在Java开发中,正确处理并发问题对于确保应用的稳定性和提高性能至关重要。本文将深入探讨Java并发编程的核心概念——线程安全,以及如何通过各种技术和策略实现它,同时保持甚至提升系统性能。我们将分析并发问题的根源,包括共享资源的竞争条件、死锁以及线程活性问题,并探索解决方案如同步机制、锁优化、无锁数据结构和并发工具类等。文章旨在为开发者提供一个清晰的指南,帮助他们在编写多线程应用时做出明智的决策,确保应用的高效和稳定运行。
|
20小时前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
2天前
|
Java 容器
Java并发编程:深入理解线程池
【5月更文挑战第21天】 在多核处理器的普及下,并发编程成为了提高程序性能的重要手段。Java提供了丰富的并发工具,其中线程池是管理线程资源、提高系统响应速度和吞吐量的关键技术。本文将深入探讨线程池的核心原理、关键参数及其调优策略,并通过实例展示如何高效地使用线程池以优化Java应用的性能。