我有一個情況,我將JPanels添加到FlowLayout,並且他們沒有將自己對齊到佈局的底部。我正在使用這個layout.setAlignOnBaseline(true)
,它將JLabel正確對齊面板的底部。但是,一旦這些標籤本身包裹在面板中,它就不再起作用。這裏是我的意思的例子,有兩個面板頂部和底部。如何讓FlowLayout將JPanels底部對齊,就像它對其他組件一樣?
import javax.swing.*;
import java.awt.*;
public class BadLayout {
private static final Font font1 = new Font("Arial", Font.BOLD, 14);
private static final Font font2 = new Font("Arial", Font.BOLD, 30);
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Bad layout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout layout = new FlowLayout(FlowLayout.LEADING, 0, 0);
layout.setAlignOnBaseline(true);
JPanel topPanel = new JPanel();
topPanel.setLayout(layout);
topPanel.setBackground(Color.BLACK);
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Foo");
label.setForeground(Color.WHITE);
label.setBackground(Color.RED);
label.setOpaque(true);
label.setFont(i % 2 == 0 ? font1 : font2);
JPanel subPanel = new JPanel();
subPanel.setLayout(layout);
subPanel.setBackground(Color.RED);
subPanel.add(label);
subPanel.setAlignmentY(Component.BOTTOM_ALIGNMENT);
topPanel.add(subPanel);
}
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(layout);
bottomPanel.setBackground(Color.DARK_GRAY);
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Foo");
label.setForeground(Color.WHITE);
label.setBackground(Color.RED);
label.setOpaque(true);
label.setFont(i % 2 == 0 ? font1 : font2);
bottomPanel.add(label);
}
JPanel parentPanel = new JPanel();
parentPanel.setLayout(new BorderLayout());
parentPanel.add(topPanel, BorderLayout.NORTH);
parentPanel.add(bottomPanel, BorderLayout.SOUTH);
frame.getContentPane().add(parentPanel);
frame.pack();
frame.setVisible(true);
});
}
}
如果你運行這段代碼,你會發現在頂部面板具有更小的「富」 S在面板中心,而在底部的一個人所期望的「底部對齊」行爲我希望對於。任何想法如何讓子JPanel行爲相同?
謝謝。我意識到我的意圖是集中於基線(而不是整個組件),因此覆蓋面板返回其組件的基線可能是我想要的。最終,我的應用程序只是將一堆標籤分組在一起,因此覆蓋應該不會太差。謝謝。 – Glucose