如何更改多行 JButton 中的行距

问题描述 投票:0回答:1

由于可以使用 html 文本创建多行按钮,因此我尝试了 html 的 line-height 属性,使用小数、像素和百分比值来更改垂直行距。但徒劳无功。

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

public class LineSpacing extends JFrame {
  public static final long serialVersionUID = 100L;

  public LineSpacing() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(480, 240);
    setLayout(new FlowLayout());
    setLocationRelativeTo(null);

    add(createBox("Decimal", new String[]{"0.8", "0.9", "1.1"}));
    add(createBox("px", new String[]{"10px", "12px", "15px"}));
    add(createBox("%", new String[]{"85%", "95%", "110%"}));
    setVisible(true);
  }


  static public void main(String args[]) {
    EventQueue.invokeLater(LineSpacing::new);
  }


  private Box createBox(String header, String[] values) {
    Box box= Box.createVerticalBox();
    JPanel p= new JPanel();
    p.add(new JLabel(header, SwingConstants.CENTER));
    box.add(p);
    for (int i=0; i<3; i++) {
      JButton b= new JButton("<html><center><span style='line-height:"+
        values[i]+"'>First line<br>and the second</span></html>");
      b.setPreferredSize(new Dimension(130, 40));
      b.setMargin(new Insets(0,0,0,0));
      box.add(b);
    }
    return box;
  }

}
java swing
1个回答
0
投票

Swing 的 HTML 支持基于 HTML 3.2 的子集,并且不完全支持 CSS 样式,其中包括所有形式的 line-height 属性。

如果 Swing 中的 HTML 渲染引擎能够识别,则

line-height
属性可能适用于相对值或百分比值。但是,由于它没有按预期工作,请考虑以下解决方法:

<span>
元素替换为
<div>
并将
line-height
设置在那里。有时,带有
div
line-height
元素会渲染得更好。

JButton b = new JButton("<html><center><div style='line-height:" +
    values[i] + "'>First line<br>and the second</div></html>");

如果 line-height 属性仍然不起作用,请使用显式间距方法,例如填充或添加带有内联字体大小的

<br>
标签。

不要依赖 HTML 样式,而是使用自定义

JButton
或具有多行支持的
JLabel
自行调整文本渲染。

示例:

import java.awt.*;
import javax.swing.*;

public class LineSpacingCustom extends JFrame {
    public static final long serialVersionUID = 100L;

    public LineSpacingCustom() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(480, 240);
        setLayout(new FlowLayout());
        setLocationRelativeTo(null);

        add(createBox("Decimal", new float[]{0.8f, 0.9f, 1.1f}));
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(LineSpacingCustom::new);
    }

    private Box createBox(String header, float[] spacings) {
        Box box = Box.createVerticalBox();
        JPanel p = new JPanel();
        p.add(new JLabel(header, SwingConstants.CENTER));
        box.add(p);

        for (float spacing : spacings) {
            JButton b = new LineHeightButton("First line\nand the second", spacing);
            b.setPreferredSize(new Dimension(130, 60));
            box.add(b);
        }
        return box;
    }
}

class LineHeightButton extends JButton {
    private final float lineSpacing;

    public LineHeightButton(String text, float lineSpacing) {
        super();
        this.lineSpacing = lineSpacing;
        setText(text);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setFont(getFont());
        String[] lines = getText().split("\n");
        int y = getInsets().top;
        for (String line : lines) {
            g2.drawString(line, getInsets().left, y += g2.getFontMetrics().getHeight() * lineSpacing);
        }
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.