Java BoxLayout对齐问题

时间:2013-11-10 15:47:30

标签: java swing alignment boxlayout

任何人都可以帮助我。为什么标签“当前”未在面板/框架中左对齐?

   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;

        }

enter image description here

2 个答案:

答案 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();
         }
      });
   }
}

这导致:

enter image description here

答案 1 :(得分:0)

将常量用于组件(左,右,中心)