代码之家  ›  专栏  ›  技术社区  ›  Jörg

如何更改多行JButton中的行距

  •  1
  • Jörg  · 技术社区  · 6 月前

    由于可以用html文本创建多行按钮,我尝试了html的 线高度 属性包含小数、像素和百分比值,用于更改垂直行间距。但徒劳无功。

    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;
      }
    
    }
    

    编辑

    感谢Dewmith Mihisara在下面提供的代码。

    我修改了他的LineHeightButton类来修复套印。

      add(createBox("Decimal", new Dimension(130, 40),
                new int[]{-1, 0, 1, 2, 4, 6}));
    .
    .
        private Box createBox(String header, Dimension dim, int[] spacings) {
    .
    .
        JButton b = new LineHeightButton("First line\nand the second",
                                         dim, spacing);
    ====================================================
    
    class LineHeightButton extends JButton {
        private final int lineSpacing;
        String text;
    
        public LineHeightButton(String text, Dimension dim, int lineSpacing) {
            super();
            this.lineSpacing = lineSpacing;
            this.text= text;
            setPreferredSize(dim);
            setMinimumSize(dim);
            setMaximumSize(dim);
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setFont(getFont());
            String[] lines = text.split("\n");
            int i= 0, y = 15;
            for (String line : lines) {
                g2.drawString(line, getInsets().left,
                y += i*(g2.getFontMetrics().getHeight()-5 + lineSpacing));
                i++;
            }
        }
    }
    

    仍然需要进行中心定位,但这不是问题所在。

    1 回复  |  直到 6 月前
        1
  •  0
  •   Dewmith Mihisara    6 月前

    Swing的HTML支持基于HTML 3.2的一个子集,它并不完全支持CSS样式,CSS样式在所有表单中都包括line-height属性。

    这个 line-height 如果Swing中的HTML呈现引擎识别出该属性,则该属性可能适用于相对值或百分比值。但是,由于它没有按预期工作,请考虑以下解决方法:

    更换 <span> 元素a <div> 并设置 线高度 在那里。有时, div 元素与 线高度 变得更好。

    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 或a 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);
            }
        }
    }