一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java Swing自定义组件库系列第七期

时间:2026-05-24 08:30:01 编辑:袖梨 来源:一聚教程网

在Java Swing开发中,原生对话框样式陈旧且功能有限,CusDialog通过自定义标题栏和圆角设计解决了这些问题。本文将详细介绍该组件的核心功能与使用方法。

自定义弹窗 — CusDialog

一、背景

针对Swing原生对话框JDialog样式陈旧、无法自定义的问题,CusDialog通过移除系统装饰并自绘标题栏,实现了与CusFrame风格统一的弹窗效果。该组件支持模态/非模态切换、拖拽移动、圆角边框、遮罩层加载等多种实用功能。

Java Swing 自定义组件库分享(七)

二、类源码

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.json.JSONObject;
import lombok.Getter;import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.RoundRectangle2D;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;/**
 1. 自定义 Dialog 弹窗
 2. 实现圆角弹窗和自定义标题栏,支持拖拽移动、模态/非模态、遮罩层加载、回调事件
 3.  4. 使用示例:
 5. CusDialog dialog = new CusDialog(frame, "弹窗标题");
 6. dialog.setSize(500, 400);
 7. dialog.showDialog();
 */
public class CusDialog extends JDialog {
    private static Integer WIDTH = 1300;
    private static Integer HEIGHT = 800;
    private final int cornerRadius = 15;
    private boolean isRoundEnabled = true;
    private JPanel titlePanel;
    private JLabel leftIcon;
    private JLabel titleLabel;
    private JLabel rightIcon;
    @Getter
    private JLabel closeButton;
    /** 关闭按钮事件 */
    private Runnable closeAction;
    private Point initialClick;
    private boolean isDragEnabled = true;
    private JPanel contentPanel;
    private boolean paintBorder = true;
    private boolean isLoading = false;
    /** 父窗口引用,用于多显示器支持 */
    private final Frame owner;
    /** 对话框关闭回调事件 */
    private Consumer callBack;    /**
     * 默认构造函数
     */
    public CusDialog() {
        this("");
    }    /**
     * 指定父窗口的构造函数
     * @param owner 父窗口
     */
    public CusDialog(Frame owner) {
        this(owner, "");
    }    /**
     * 带标题的构造函数
     * @param title 弹窗标题
     * @param sizes 尺寸 [宽, 高]
     */
    public CusDialog(String title, Integer... sizes) {
        super((Frame) null, title, true);
        if (ArrayUtil.isNotEmpty(sizes)) {
            if (sizes.length == 1) WIDTH = sizes[0];
            if (sizes.length > 1) {
                WIDTH = sizes[0];
                HEIGHT = sizes[1];
            }
        }
        this.owner = null;
        setSize(WIDTH, HEIGHT);
        initialized();
    }    /**
     * 指定父窗口和标题的构造函数
     * @param owner 父窗口
     * @param title 弹窗标题
     */