任何人都可以帮助我。为什么标签“当前”未在面板/框架中左对齐?
public static void main(String[] args) {
JFrame TFrame = new JFrame("Test DisplayLayout");
TFrame.setResizable(true);
TFrame.setSize(new Dimension(900, 840));
TFrame.setLocationRelativeTo(null);
TFrame.setTitle("DisplayLayout");
TFrame.setVisible(true);
JPanel P = DisplayLayout2();
P.setVisible(true);
P.setOpaque(true);
P.setLayout(new BoxLayout(P, BoxLayout.Y_AXIS));
TFrame.add(P);
TFrame.revalidate();
TFrame.repaint();
}
public static JPanel DisplayLayout2() {
JPanel Panel=new JPanel();
Panel.setVisible(true);
Panel.setOpaque(true);
Panel.setLayout(new BoxLayout(Panel, BoxLayout.Y_AXIS));
Panel.setAlignmentX(Component.LEFT_ALIGNMENT);
JLabel lab = new JLabel("Current");
lab.setHorizontalAlignment(SwingConstants.LEFT);
lab.setForeground(Color.WHITE);
lab.setBackground(Color.PINK);
lab.setOpaque(true);
Panel.add(lab,Component.LEFT_ALIGNMENT);
JPanel posPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane(posPanel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setPreferredSize(new Dimension(290, 200));
scrollPane.setOpaque(true);
posPanel.setBackground(Color.YELLOW);
posPanel.setPreferredSize(new Dimension(290, 200));
posPanel.setLayout(new BoxLayout(posPanel, BoxLayout.Y_AXIS));
posPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
Panel.add(scrollPane);
return Panel;
}
答案 0 :(得分:0)
这是BoxLayout的怪癖之一(好吧,对我来说很怪癖,但这是一个记录在案的预期行为),我忘记了为什么会这样做,但我做了知道至少一种解决方法:将JLabel放入使用FlowLayout.LEFT(或LEADING)的JPanel中,并将其添加到使用BoxLayout的容器中:
JPanel labPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
labPanel.add(lab);
panel.add(labPanel, Component.LEFT_ALIGNMENT);
请注意,我认为它与JLabel有关,而不想在封装它的JPanel中进行扩展,但是不要引用我。
修改强>
来自BoxLayout Tutorial:
对于从上到下的方框布局,容器的首选宽度是子容器的最大首选宽度。如果容器被强制宽,BoxLayout会尝试将每个组件的宽度调整为容器宽度的宽度(减去insets)。如果组件的最大尺寸小于容器的宽度,则X对齐起作用。
您可以通过将JLabel的和JScrollPane的 x-alignment设置为Component.LEFT_ALIGNMENT来解决此问题。您当前的代码忘记设置JScrollPane的x-alignment,这就是您的麻烦所在:
scrollPane.setAlignmentX(Component.LEFT_ALIGNMENT);
例如:
import java.awt.*;
import javax.swing.*;
public class Foo2 {
private static void createAndShowGui() {
JLabel topLabel = new JLabel("Top Label", SwingConstants.LEFT);
topLabel.setOpaque(true);
topLabel.setBackground(Color.pink);
JScrollPane scrollpane = new JScrollPane(
Box.createRigidArea(new Dimension(400, 400)),
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
mainPanel.add(topLabel);
scrollpane.setAlignmentX(Component.LEFT_ALIGNMENT);
mainPanel.add(scrollpane);
JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
这导致:
答案 1 :(得分:0)
将常量用于组件(左,右,中心)