swing-组件tooltip测试及美化

这篇博客介绍了如何在Java Swing中扩展JToolTip类来创建美观的提示框。通过覆盖updateUI、paintComponent和setTipText方法,实现自定义的背景色、前景色和形状。此外,还展示了如何设置全局Tooltip显示速度,并提供了测试代码以展示默认和自定义Tooltip的效果。
摘要由CSDN通过智能技术生成
tooltip 可以对一些操作的进一步说明,h5中常用的title属性属于最简单的tooltip,但是在更多的框架中为了美观,会有tooltip插件, 可以实现更漂亮的tooltip . swing可以扩展JToolTip类实现更美观的提示框.

在这里插入图片描述

swing实现tooltip

  • 继承JTooltip类
  • 重写updateUI方法
  • 重写paintComponent 自定义形状和背景色
  • 重写setTipText 自定义前景色

总结

  • ToolTipManager 可以对tooltip显示的速度设置
  • new JButton时 可以直接覆写默认方法

测试代码


import com.formdev.flatlaf.FlatLightLaf;
import com.mynote.core.ui.ColorBuilder;
import com.mynote.core.util.FrameUtil;
import com.mynote.example.demo.AbstractDefaultPanel;
import net.miginfocom.swing.MigLayout;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D;
import java.util.Optional;

/**
 * 修改tooltip
 */
public class ToolTipTest extends AbstractDefaultPanel {

    private JButton defaultToolTip;
    private JButton defineToolTip;

    @Override
    protected void init() {
        // 全局tooltip 显示速度设置
        ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
//        toolTipManager.setDismissDelay(2000);
        toolTipManager.setInitialDelay(100);

        defaultToolTip = new JButton("defaultToolTip");
        defaultToolTip.setToolTipText("默认提示");

        // 自定义tooltip
        defineToolTip = new JButton("defineToolTip") {
            @Override
            public JToolTip createToolTip() {
                return new BalloonToolTip(ColorBuilder.BG_BLANK_COLOR1, Color.WHITE);
            }
        };
        defineToolTip.setToolTipText("自定义提示样式");

    }

    @Override
    protected void render() {
        view.setLayout(new MigLayout("wrap 1,center"));
        super.createViewRow(new JLabel("default tooltip 消息:"), defaultToolTip);
        super.createViewRow(new JLabel("define tooltip 消息:"), defineToolTip);
        super.add(view);
    }

    @Override
    protected void bindEvents() {

    }


    public static void main(String[] args) {
        FlatLightLaf.install();
        FrameUtil.launchTest(new ToolTipTest());
    }

    private class BalloonToolTip extends JToolTip {
        private static final long serialVersionUID = 1L;
        private transient HierarchyListener listener;

        /**
         * 背景色
         */
        private Color bgColor;

        /**
         * 前景色
         */
        private Color fgColor;

        public BalloonToolTip(Color bgColor, Color fgColor) {
            this.bgColor = bgColor;
            this.fgColor = fgColor;
        }

        @Override
        public void updateUI() {
            removeHierarchyListener(listener);
            super.updateUI();
            listener = e -> {
                Component c = e.getComponent();
                if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && c.isShowing()) {
                    Optional.ofNullable(SwingUtilities.getRoot(c)).filter(JWindow.class::isInstance)
                            .map(JWindow.class::cast).ifPresent(w -> w.setBackground(new Color(0x0, true)));
                }
            };
            addHierarchyListener(listener);
            setOpaque(false);
            setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 5));
        }

        @Override
        public Dimension getPreferredSize() {
            Dimension d = super.getPreferredSize();
            d.height = 35;
            return d;
        }

        @Override
        protected void paintComponent(Graphics g) {
            Shape s = makeBalloonShape();
            Graphics2D g2 = (Graphics2D) g.create();
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(bgColor);
            g2.fill(s);
            g2.setColor(bgColor);
            g2.draw(s);
            g2.dispose();
            super.paintComponent(g);
        }

        private Shape makeBalloonShape() {
            Insets i = getInsets();
            float w = getWidth() - 1f;
            float h = getHeight() - 1f;
            float v = i.top * .5f;
            Path2D triangle = new Path2D.Float();
            triangle.moveTo(i.left + v + v, 0f);
            triangle.lineTo(i.left + v, v);
            triangle.lineTo(i.left + v + v + v, v);
            Area area = new Area(new RoundRectangle2D.Float(0f, v, w, h - i.bottom - v, i.top, i.top));
            area.add(new Area(triangle));
            return area;
        }

        @Override
        public void setTipText(String tipText) {
            super.setForeground(fgColor);
            super.setTipText(tipText);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值