1

谁能帮我。为什么标签“当前”没有在面板/框架中左对齐?

   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;

        }

在此处输入图像描述

4

2 回答 2

0

在组件中使用常量(左、右、中)

于 2013-11-10T16:27:35.820 回答
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 教程编辑

对于从上到下的框布局,容器的首选宽度是子项的最大首选宽度。如果容器被迫比这更宽,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();
         }
      });
   }
}

这导致:

在此处输入图像描述

于 2013-11-10T16:04:37.523 回答