【发布时间】:2012-11-06 00:41:07
【问题描述】:
我正在创建一个我使用BoxLayout 的应用程序。正如您在下图中看到的,当标题字符串很短时,它是完美的。但是随着字符串变长,JLabel 越来越错位。
下面是一些与问题相关的代码:
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
frame.add(centerPanel, BorderLayout.CENTER);
//...
JLabel l = new JLabel(/*...*/);
l.setHorizontalAlignment(SwingConstants.CENTER); //I tried removing and adding
//this but nothing changed
centerPanel.add(l);
我有什么明显的遗漏吗? Google 没有帮助解决这个问题。
如果它很重要,国家标签进度条的东西只是JPanels 和FlowLayouts。
SSCCE:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class SSCCE {
public static void main(String[] args) {
final JFrame f = new JFrame("SSCCE");
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
final JLabel[] titles = new JLabel[5];
JPanel[] smallPanels = new JPanel[titles.length];
for (int i = 0; i < smallPanels.length; i ++) {
titles[i] = new JLabel(Math.random() < 0.5 ? "foo" : "bar");
p.add(titles[i]);
smallPanels[i] = new JPanel();
smallPanels[i].add(new JLabel("foobar"));
smallPanels[i].add(new JProgressBar());
p.add(smallPanels[i]);
}
f.add(p, BorderLayout.CENTER);
final JTextField tf = new JTextField("foobar");
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
titles[2].setText(tf.getText());
f.repaint();
}
});
f.add(tf, BorderLayout.NORTH);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 600);
f.setVisible(true);
}
}
要操作 SSCCE,请在文本字段中输入内容并按 Enter。
【问题讨论】:
-
我猜是对齐有问题,看看这个,希望对你有帮助docs.oracle.com/javase/tutorial/uiswing/layout/…
-
@Zara 我确实试过了。什么都没发生
-
好吧,实际上在这个链接中,他们讨论了和你一样的问题。
-
@Zara 是的,但我试过了,但什么也没发生,正如你在我上一条评论中看到的那样。
-
SSCCE 1+ 和以下两个答案!
标签: java swing alignment boxlayout preferredsize