首页 > 解决方案 > Swing JLabel:提供文本和下划线之间的间隙

问题描述

如何在不使用 HTML 或自定义绘画(如此),但使用字体属性的情况下,在文本和下划线之间提供一些像素间隙。这是我的 MRE:

import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.Collections;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class LabelTryout {

    public static void main(String[] args) {
        JLabel label = new JLabel("Here is a underlined text");
        label.setFont(underlineFont(label.getFont()));
        label.setHorizontalAlignment(SwingConstants.CENTER);
        JFrame frm = new JFrame("Underline");
        frm.add(label);
        frm.setSize(300, 200);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    /**
     * Gets the underline font for the given base font.
     * 
     * @param aBaseFont base font to paint it as underline.
     * @return underline font.
     */
    public static Font underlineFont(Font aBaseFont) {
        // here I want to provide gap for the base font.
        return aBaseFont.deriveFont(Collections.singletonMap(TextAttribute.UNDERLINE,
                                                             TextAttribute.UNDERLINE_ON));
    }

}

如果不可能,请解释一下。

标签: javaswingjlabel

解决方案


我不知道您可以使用任何属性来配置它。

如果您不想扩展标签来进行自定义绘画,那么您可以尝试:

  1. 使用CompoundBorder. 您可以使用 anEmptyBorder和 aMatteBorder来模拟线条的绘制

  2. 上述方法取决于布局和以其首选大小显示的标签。要强制执行此操作,您可以将标签包裹在 aJPanel中,FlowLayout因为此布局尊重首选大小。

  3. 创建您自己的自定义Border。的绘画逻辑Border将查看首选尺寸和实际尺寸并相应地绘制线条。

  4. 创建一个Icon也使用上述方法的自定义。

这些可能是在不扩展 JLabel 的情况下进行自定义绘制的方法。


推荐阅读