Mam przypadek, w którym dodaje JPanels do FlowLayout, i nie są one wyrównanie się do dolnej części układu. Używam tego layout.setAlignOnBaseline(true)
i poprawnie wyrównuje JLabels do dolnej części panelu. Jednakże, gdy etykiety te są już zapakowane w panele, nie działają one już. Oto przykład tego, co mam na myśli, z dwoma panelami u góry iu dołu.Jak mogę uzyskać FlowLayout, aby dopasować JPanels na dole, tak jak robi to dla innych składników?
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);
});
}
}
Po uruchomieniu tego kodu zauważysz górny panel ma mniejsze „foo” S w środku panelu, natomiast jeden na dole jest pożądany „bottom-wyrównane” zachowanie mam nadzieję dla. Jakieś pomysły, jak sprawić, aby sub-JPanele zachowywały się tak samo?
Dzięki. Zdałem sobie sprawę, że moim zamiarem było skupienie się na linii bazowej (a nie na całym komponencie), więc nadrzędność tego panelu, aby przywrócić linię bazową jego komponentów, jest prawdopodobnie tym, czego chcę. Ostatecznie moja aplikacja to po prostu grupowanie grup etykiet, więc nie powinno być źle. Dziękuję Ci. – Glucose