Java将JLabel与JPanel的中心对齐

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

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

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

是否有可能迫使JLabel保持死亡中心?

注意:按钮永远不会变得足够大,无法满足JLabel的任何边缘,因此这不是问题。

在我看来你需要标签以其首选尺寸显示,然后你需要一个左右面板来同样填充窗口中可用的剩余空间。

您可以使用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(); } }); } } 

您还可以使用带有X_AXIS布局的BoxLayout ,并添加到容器中

编辑:这是一个例子

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

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

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

 setAlignmentX(java.awt.Component.CENTER_ALIGNMENT) 

 setAlignmentY(java.awt.Component.CENTER_ALIGNMENT) 

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

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