【问题标题】:Java align JLabel in center of JPanelJava 在 JPanel 的中心对齐 JLabel
【发布时间】:2011-03-17 21:40:23
【问题描述】:

我的应用程序顶部有一个栏,在 JLabel 的两侧有许多按钮。按钮的可见性取决于用户正在执行的当前任务,并且按钮的其中一个文本也可能会根据当前状态而改变。

我想做的是在 JPanel 的左侧粘贴一些按钮,JLabel 的中心位于 JPanel 的正中心,其余按钮位于 JPanel 的右侧。

到目前为止,我已经设法使用各种方法和布局管理器将按钮固定在左侧和右侧,但我无法让 JLabel 的中心位于 JPanel 的死点。我设法得到的最好的标签是离中心足够近的标签,但随着按钮设置为可见或它们的文本发生变化,它会四处移动。

是否可以强制 JLabel 保持死点?

注意:按钮永远不会变大到足以与 JLabel 的任一边缘相接,所以这不是问题。

【问题讨论】:

    标签: java swing jpanel jlabel layout-manager


    【解决方案1】:

    您也可以使用 BoxLayoutX_AXIS 布局,并添加到容器中

    编辑:这是一个例子

    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
    panel.add(Box.createHorizontalGlue());
    panel.add(innerPanel);
    panel.add(Box.createHorizontalGlue());
    

    【讨论】:

    • 刚刚发现这仅在 panel 将其最小和最大尺寸设置为首选尺寸时才有效。
    【解决方案2】:

    正如我所见,您需要以首选尺寸显示标签,然后您需要一个左右面板来平均填充窗口中剩余的可用空间。

    您可以使用Relative Layout 类。

    import java.awt.*;
    import javax.swing.*;
    
    public class RelativeSSCCE extends JPanel
    {
        public RelativeSSCCE()
        {
            JPanel left = new JPanel( new FlowLayout(FlowLayout.LEFT) );
            left.add( new JButton("L1") );
            left.add( new JButton("L2") );
            left.add( new JButton("L3") );
    
            JLabel center = new JLabel("Centered");
    
            JPanel right = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
            right.add( new JButton("Right1") );
            right.add( new JButton("Right2") );
            right.add( new JButton("Right3") );
    
            // choose your layout manager here
    
            setLayout( new RelativeLayout() );
            Float ratio = new Float(1);
            add(left, ratio);
            add(center);
            add(right, ratio);
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("Basic RelativeSSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new RelativeSSCCE() );
            frame.setSize(600, 100);
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    【讨论】:

    • 我还没有尝试相对布局,但是GridBagLayout和BorderLayout有同样的问题。左右面板的宽度不相等,因此中心面板没有真正居中。
    • RelativeLayout 很好用,本来希望使用默认布局管理器,但看起来他们无法处理看似微不足道的任务。谢谢。
    【解决方案3】:

    使用BorderLayout。添加带有 BorderLayout.CENTER 约束的 JLabel 并添加一对带有 BorderLayout.EAST 和 BorderLayout.WEST 约束的 JPanel。将您的附加按钮添加到相应的 JPanel。

    要使文本居中显示,您还需要将 Label 的 Horizo​​ntalAlignment 设置为 JLabel.CENTER。

    【讨论】:

    • 我试过了,但是因为东西面板的大小不相等,面板中的按钮数量和按钮上的文本可以改变,中心实际上并没有居中面板。
    【解决方案4】:
    setAlignmentX(java.awt.Component.CENTER_ALIGNMENT)
    

    setAlignmentY(java.awt.Component.CENTER_ALIGNMENT) 
    

    如果与必须居中的元素一起使用可能会有所帮助,例如面板

    【讨论】:

      【解决方案5】:

      可能是我在发布 necroposting,但 setAlignmentX(java.awt.Component.CENTER_ALIGNMENT) 和 setAlignmentY(java.awt.Component.CENTER_ALIGNMENT) 可能会有所帮助...

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 2013-07-04
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多