You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为JFrame/JDialog标题栏文本着色及拓展标题栏功能?

问题1:JFrame标题栏文本着色

Swing的原生标题栏由操作系统负责绘制,setTitle()方法不支持HTML格式,也无法直接修改文本颜色。如果不想通过自定义LookAndFeel实现,最直接的方案是隐藏原生标题栏,自定义标题栏组件:

  • 实现步骤:
    1. 调用setUndecorated(true)隐藏系统标题栏
    2. 自定义一个JPanel作为标题栏,添加带HTML格式的JLabel实现彩色文本(用法和普通JLabel完全一致)
    3. 给自定义标题栏补充拖拽窗口、最小化/关闭等系统功能(按需添加)

示例代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CustomTitleBarFrame extends JFrame {
    private int dragX, dragY;

    public CustomTitleBarFrame() {
        setUndecorated(true);
        setSize(400, 300);
        setLocationRelativeTo(null);

        // 自定义标题栏面板
        JPanel titleBar = new JPanel(new BorderLayout());
        titleBar.setBackground(Color.DARK_GRAY);

        // 彩色标题文本(HTML格式实现)
        JLabel titleLabel = new JLabel("<html><font color='red'>彩色标题栏文本</font></html>");
        titleLabel.setForeground(Color.WHITE);
        titleLabel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 0));
        titleBar.add(titleLabel, BorderLayout.WEST);

        // 添加关闭按钮
        JButton closeBtn = new JButton("X");
        closeBtn.setForeground(Color.WHITE);
        closeBtn.setBackground(Color.RED);
        closeBtn.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
        closeBtn.addActionListener(e -> System.exit(0));
        titleBar.add(closeBtn, BorderLayout.EAST);

        // 实现窗口拖拽功能
        titleBar.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                dragX = e.getX();
                dragY = e.getY();
            }
        });
        titleBar.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                setLocation(getX() + e.getX() - dragX, getY() + e.getY() - dragY);
            }
        });

        // 组装窗口
        add(titleBar, BorderLayout.NORTH);
        add(new JLabel("窗口内容区域"), BorderLayout.CENTER);

        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(CustomTitleBarFrame::new);
    }
}
问题2:JDialog标题栏添加红色警告文本及扩展需求

针对你的JDialog场景,原生标题栏同样无法满足需求,推荐自定义标题栏,既能放置红色警告文本,又不会增大窗口垂直尺寸(直接替换原标题栏的空间即可):

  • 替代方案:
    1. 对JDialog调用setUndecorated(true)隐藏原生标题栏
    2. 自定义标题栏面板,左侧保留原标题文本,右侧添加红色警告文本(用HTML格式的JLabel)
    3. 保留窗口拖拽、关闭等基础功能,完全不影响原有窗口的布局和尺寸

关于你提到的其他疑问:

  • 没有直接像操控JLabel那样修改原生标题栏文本的方式,因为原生标题栏不属于Swing组件,由操作系统管控
  • 在标题栏添加控件(如保存图标、搜索框):通过自定义标题栏即可实现,在JPanel中直接添加按钮、文本框等组件,就能达到类似Excel的效果
  • JavaFX支持该功能:JavaFX的Stage可以通过StageStyle.UNDECORATED隐藏原生标题栏,自定义标题栏区域后可添加任意控件(Button、TextField等),原生API就能轻松实现标题栏加控件的需求,比Swing更灵活

示例代码(JDialog自定义标题栏):

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class WarningDialog extends JDialog {
    private int dragX, dragY;

    public WarningDialog(JFrame parent) {
        super(parent, "后门访问", true);
        setUndecorated(true);
        setSize(500, 300);
        setLocationRelativeTo(parent);

        // 自定义标题栏
        JPanel titleBar = new JPanel(new BorderLayout());
        titleBar.setBackground(Color.LIGHT_GRAY);

        // 原标题文本
        JLabel titleLabel = new JLabel("后门访问");
        titleLabel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 0));
        titleBar.add(titleLabel, BorderLayout.WEST);

        // 红色警告文本
        JLabel warningLabel = new JLabel("<html><font color='red'>警告:误操作可能损坏硬件</font></html>");
        warningLabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 10));
        titleBar.add(warningLabel, BorderLayout.EAST);

        // 关闭按钮
        JButton closeBtn = new JButton("×");
        closeBtn.setPreferredSize(new Dimension(30, 30));
        closeBtn.addActionListener(e -> dispose());
        titleBar.add(closeBtn, BorderLayout.EAST);

        // 拖拽功能
        titleBar.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                dragX = e.getX();
                dragY = e.getY();
            }
        });
        titleBar.addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                setLocation(getX() + e.getX() - dragX, getY() + e.getY() - dragY);
            }
        });

        // 添加原有功能组件(示例)
        JPanel content = new JPanel();
        content.add(new JButton("功能按钮1"));
        content.add(new JButton("功能按钮2"));
        add(titleBar, BorderLayout.NORTH);
        add(content, BorderLayout.CENTER);

        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new WarningDialog(new JFrame()));
    }
}

内容的提问来源于stack exchange,提问作者AlexHomeBrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:38