我正在尝试使用HTML格式来在JLabel上显示上标,但是它似乎比标准字体占用更多的空间,因此低于上标的所有JLabel都被下移了。每个JLabel应该与JTextField对齐,这就是为什么这会使它看起来有些混乱的原因。

我的描述可能有些复杂,但是下面的代码可以编译,因此您可以了解我在说什么。第五个标签是带有上标的标签,并导致其余标签脱节。

import javax.swing.*;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

class JLabelExample extends JFrame {

    private JPanel wrapper, configInputPanel;
    private GridBagConstraints gbc;

    JLabelExample() {
        configInputPanel();
        wrapper();
        add(wrapper);

        pack();
        setVisible(true);
    }

    private void wrapper() {
        wrapper = new JPanel(new GridBagLayout());
        wrapper.setBorder(BorderFactory.createEmptyBorder(25, 25, 20, 25));
        JPanel inner = new JPanel(new GridBagLayout());
        inner.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("Configuration"),
            BorderFactory.createEmptyBorder(15, 15, 15, 15)));

        gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        inner.add(configInputPanel, gbc);

        gbc.gridx = 0;
        wrapper.add(inner, gbc);
    }

    private void configInputPanel() {
        configInputPanel = new JPanel(new GridBagLayout());
        gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(0, 5, 0, 5);
        gbc.gridx = 0;
        configInputPanel.add(new JLabel("Fuselage Length (m)"), gbc);
        configInputPanel.add(new JLabel("Fuselage Width (m)"), gbc);
        configInputPanel.add(new JLabel("Fuselage Height (m)"), gbc);
        configInputPanel.add(new JLabel("Wing Span (m)"), gbc);
        configInputPanel.add(new JLabel("<html>Wing Area (m<sup>2</sup>)</html>"), gbc);
        configInputPanel.add(new JLabel("Wing Sweep (degree)"), gbc);
        configInputPanel.add(new JLabel("Nose Gear to Fuselage Tip (m)"), gbc);
        configInputPanel.add(new JLabel("Main Gear to Nose Gear (m)"), gbc);
        configInputPanel.add(new JLabel("Main Gear Separation (m)"), gbc);
        configInputPanel.add(new JLabel("Body Gear to Nose Gear (m)"), gbc);
        configInputPanel.add(new JLabel("Body Gear Separation (m)"), gbc);
        configInputPanel.add(new JLabel("Engine to Centerline (m)"), gbc);

        gbc.gridx = 1;
        for (int i = 0; i < 12; i++) {
            JTextField textfield = new JTextField(5);
            textfield.setHorizontalAlignment(JTextField.RIGHT);
            configInputPanel.add(textfield, gbc);
        }
    }

    public static void main(String[] args) {
        new JLabelExample();
    }
}

最佳答案

由于您正在寻找技巧,因此我允许自己提出建议。它不是上标,而是这样可读的。

java - JLabel HTML上标困惑了格式。有什么技巧可以解决这个问题?-LMLPHP

private void configInputPanel() {

    JPanel trickPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
    JLabel label1 = new JLabel("Wing Area (m");
    JLabel supLabel = new JLabel("2");
    Font font = label1.getFont();
    supLabel.setFont(font.deriveFont(font.getSize() / 1.5f));
    trickPanel.add(label1);
    trickPanel.add(supLabel);
    trickPanel.add(new JLabel(")"));

    configInputPanel = new JPanel(new GridBagLayout());
    gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.WEST;
    gbc.insets = new Insets(0, 5, 0, 5);
    gbc.gridx = 0;
    configInputPanel.add(new JLabel("Fuselage Length (m)"), gbc);
    configInputPanel.add(new JLabel("Fuselage Width (m)"), gbc);
    configInputPanel.add(new JLabel("Fuselage Height (m)"), gbc);
    configInputPanel.add(new JLabel("Wing Span (m)"), gbc);
    configInputPanel.add(trickPanel, gbc);
    configInputPanel.add(new JLabel("Wing Sweep (degree)"), gbc);
    configInputPanel.add(new JLabel("Nose Gear to Fuselage Tip (m)"), gbc);
    configInputPanel.add(new JLabel("Main Gear to Nose Gear (m)"), gbc);
    configInputPanel.add(new JLabel("Main Gear Separation (m)"), gbc);
    configInputPanel.add(new JLabel("Body Gear to Nose Gear (m)"), gbc);
    configInputPanel.add(new JLabel("Body Gear Separation (m)"), gbc);
    configInputPanel.add(new JLabel("Engine to Centerline (m)"), gbc);

    gbc.gridx = 1;
    for (int i = 0; i < 12; i++) {
        JTextField textfield = new JTextField(5);
        textfield.setHorizontalAlignment(JTextField.RIGHT);
        configInputPanel.add(textfield, gbc);
    }
}

无间隙LEADING对齐的FlowLayout给人以连续单个标签的印象。较小的字体大小是上标大小的近似值。对于不同的字体,可能需要进行调整,但是由于其源自其姊妹标签字体,因此在任何情况下都应该合理。

09-30 18:02
查看更多