web-dev-qa-db-ja.com

JLabelをJPanelの中​​央に配置

NetBeans GUIビルダーを使用してレイアウトを処理しており(LayoutManagersではひどいです)、単純なJLabelを配置して、親JPanel内で常に(水平方向に)中央に配置しようとしています。理想的には、これはJPanelのサイズが変更された場合でも当てはまりますが、それが非常に多くのコーディングである場合は、JPanelが最初に作成されたときに中央に配置するだけで十分です。

自分でレイアウトを処理しようとするのは十分に悪いですが、NetBeans GUI Builderが不変のコードを自動生成するため、このセンタリングを行う方法を理解することができず、オンラインで役立つものを見つけることができませんでした。

私を正しい方向に導くことができる人に感謝します!

14
IAmYourFaja

Borderlayout を使用すると、 JComponents のいずれかをCENTER領域に配置できます。例については、 Stack Overflowの質問への回答JPanels間のギャップを取り除く を参照してください。これはうまくいくはずです。

12
mKorbel

コンポーネントを中央に配置する4つの方法は次のとおりです。

4 Centered Components

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

class CenterComponent {

    public static JLabel getLabel(String text) {
        return getLabel(text, SwingConstants.LEFT);
    }

    public static JLabel getLabel(String text, int alignment) {
        JLabel l = new JLabel(text, alignment);
        l.setBorder(new LineBorder(Color.RED, 2));
        return l;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = new JPanel(new GridLayout(2,2,4,4));
                p.setBackground(Color.black);
                p.setBorder(new EmptyBorder(4,4,4,4));

                JPanel border = new JPanel(new BorderLayout());
                border.add(getLabel(
                    "Border", SwingConstants.CENTER), BorderLayout.CENTER);
                p.add(border);

                JPanel gridbag = new JPanel(new GridBagLayout());
                gridbag.add(getLabel("GridBag"));
                p.add(gridbag);

                JPanel grid = new JPanel(new GridLayout());
                grid.add(getLabel("Grid", SwingConstants.CENTER));
                p.add(grid);

                // from @0verbose
                JPanel box = new JPanel();
                box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS ));

                box.add(Box.createHorizontalGlue());
                box.add(getLabel("Box"));
                box.add(Box.createHorizontalGlue());
                p.add(box);

                JFrame f = new JFrame("Streeeetch me..");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}
27
Andrew Thompson

BoxLayoutを使用しても、次のことを実現できます。

JPanel listPane = new JPanel();
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS ));

JLabel label = new JLabel();
listPane.add(Box.createHorizontalGlue());
listPane.add(label);
listPane.add(Box.createHorizontalGlue());

mKorbelのソリューションはあなたの目標に最適です。とにかく、BoxLayoutは非常に柔軟性があるので、いつも提案したいと思います。

10
Heisenbug

Mara:「ご回答ありがとうございます。ただし、NetBeans GUIビルドはGroupLayoutを使用しているため、これを上書きすることはできません。」

正しくありません! NetBeans GUIビルダーのJFrame(またはその他のGUIコンテナー)内の任意の場所を右クリックして、「レイアウトの設定」を選択します。デフォルトでは、グループレイアウトである「フリーデザイン」が選択されていますが、mKorbelのアドバイスに従って、ボーダーレイアウトを含む他のレイアウトを選択できます。

6
jirka.pinkas

使用するレイアウトマネージャーに応じて、これを行う方法はたくさんあります。 コンテナ内のコンポーネントのレイアウト チュートリアルを読むことをお勧めします。

レイアウトマネージャーに関係なく、次のことが機能すると思います。

JLabel.setHorizontalAlignment(SwingConstants.CENTER)

5
mre