Java выравнивает JLabel по центру JPanel - PullRequest
6 голосов
/ 18 марта 2011

В верхней части моего приложения есть панель с несколькими кнопками по обе стороны от JLabel. Видимость кнопки зависит от текущей задачи, которую выполняет пользователь, и один из текстов кнопки также может меняться в зависимости от текущего состояния.

То, что я хотел бы сделать, это чтобы несколько кнопок придерживались слева от JPanel, центр JLabel находился в самом центре JPanel, а остальные кнопки были бы справа от JPanel.

До сих пор мне удавалось удерживать кнопки, придерживающиеся влево и вправо, используя различные методы и менеджеры компоновки, но я не могу заставить центр JLabel находиться в мертвой точке JPanel. Лучшее, что мне удалось получить, - это метка, расположенная достаточно близко к центру, но затем она будет перемещаться, когда кнопки видны или их текст меняется.

Можно ли заставить JLabel оставаться в мертвой точке?

Примечание: кнопки никогда не станут достаточно большими, чтобы соответствовать краю JLabel, так что это не проблема.

Ответы [ 5 ]

8 голосов
/ 18 марта 2011

Вы также можете использовать BoxLayout с макетом X_AXIS и добавить в контейнер

Редактировать: Вот пример

panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(Box.createHorizontalGlue());
panel.add(innerPanel);
panel.add(Box.createHorizontalGlue());
3 голосов
/ 18 марта 2011

На мой взгляд, вам нужно, чтобы метка отображалась в нужном размере, а затем вам нужна левая и правая панели, чтобы равномерно заполнить оставшееся пространство в окне.

Вы можете использовать класс 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();
            }
        });
    }
}
3 голосов
/ 18 марта 2011

Использование BorderLayout . Добавьте JLabel с ограничением BorderLayout.CENTER и добавьте пару JPanels с ограничениями BorderLayout.EAST и BorderLayout.WEST. Добавьте ваши дополнительные кнопки в соответствующую JPanel.

Чтобы текст отображался по центру, вам также необходимо установить для горизонтального выравнивания метки значение JLabel.CENTER.

2 голосов
/ 03 апреля 2013
setAlignmentX(java.awt.Component.CENTER_ALIGNMENT)

и

setAlignmentY(java.awt.Component.CENTER_ALIGNMENT) 

может помочь, если используется с элементами, которые должны быть отцентрированы, например, JPanel

0 голосов
/ 03 апреля 2013

может быть я некропостирую, но setAlignmentX (java.awt.Component.CENTER_ALIGNMENT) и setAlignmentY (java.awt.Component.CENTER_ALIGNMENT) могут помочь ...

...