web-dev-qa-db-ja.com

JPanelでのJLabelの中央揃え

JPanelから派生したパネルがあります。 JLabelから派生したカスタムコントロールがあります。このカスタムJLabelをパネルの中央に配置しようとしています。

これを行うための唯一の方法は、nullレイアウト(setLayout(null))を使用してから、カスタムJLabelのsetLocation()ポイントを計算して、適切な場所に配置することです。

このアプリでは、カスタムJLabelが1つのパネルからこのパネルに物理的に移動され、以前にsetLocationで設定された場所が影響していると考えています。ただし、(0,0)に設定すると、コンポーネントは左上隅に上がります。

BorderLayoutは機能しません。コンポーネントが1つだけ提供され、_BorderLayout.CENTER_に配置されると、中央セクションが展開されてすべてのスペースがいっぱいになるためです。

別のサイトから切り取って貼り付けた例では、BoxLayoutcomponent.setAlignmentX(Component.CENTER_ALIGNMENT)を使用しました。これも機能しませんでした。

別の回答では、パネルのgetInset()関数をオーバーライドすることについて言及しました(それはそれが呼ばれたものだと思います)が、それは行き止まりであることが判明しました。

これまでは、GridBagLayoutレイアウトのパネルで作業しており、カスタムGridBagConstraintsをパネルに挿入するときにJLabelオブジェクトを含めています。ただし、これは非効率的です。 JLabelJPanelの中央に配置するより良い方法はありますか?

18
Shackleford

GridBagLayoutJPanel に設定 JLabelGridBagConstraintsJPanel 、-に設定 JLabel は中央揃えになります

enter image description here

import Java.awt.*;
import javax.swing.*;

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("CenteredJLabel");

    public CenteredJLabel() {
        panel.setLayout(new GridBagLayout());
        panel.add(label);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}
34
mKorbel

JLabelの名前がlabelであると仮定し、次を使用します。

label.setHorizontalAlignment(JLabel.CENTER);
16
hiuller

Java Standard LibraryにあるすべてのLayoutManagersを忘れて、 MigLayout を使用してください。私の経験では、通常、期待どおりの動作をする方がはるかに簡単です。

以下は、MigLayoutを使用した後の目標を達成する方法です。

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Test
{
    public static void main( String[] args )
    {
        JFrame frame = new JFrame( );
        JPanel panel = new JPanel( );

        // use MigLayout
        panel.setLayout( new MigLayout( ) );

        // add the panel to the frame
        frame.add( panel );

        // create the label
        JLabel label = new JLabel( "Text" );

        // give the label MigLayout constraints
        panel.add( label, "Push, align center" );

        // show the frame
        frame.setSize( 400, 400 );
        frame.setVisible( true );
    }
}

そのほとんどは単なる定型です。キーはレイアウト制約です:"Push, align center"

align centerは、MigLayoutにJLabelをグリッドセルの中央に配置するように指示します。

Pushは、利用可能なスペースを埋めるためにグリッドセルを拡張するようMigLayoutに指示します。

8
ulmangt

BoxLayoutがその方法です。 X_AXIS BoxLayoutを設定する場合、コンポーネントの前後に水平方向の接着剤を追加してみてください。

panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
8
Jakub Zaverka