我正在尝试使用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();
}
}
最佳答案
由于您正在寻找技巧,因此我允许自己提出建议。它不是上标,而是这样可读的。
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
给人以连续单个标签的印象。较小的字体大小是上标大小的近似值。对于不同的字体,可能需要进行调整,但是由于其源自其姊妹标签字体,因此在任何情况下都应该合理。