web-dev-qa-db-ja.com

JFrame内のJPanelのサイズを自動調整

ボタン、ラベル、テーブルなどを追加するJPanelサブクラスがあります。画面に表示するには、JFrameを使用します。

MainPanel mainPanel = new MainPanel(); //JPanel subclass

JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

しかし、ウィンドウのサイズを変更しても、パネルのサイズは変わりません。パネルのサイズを変更しても、パネルのサイズをウィンドウのサイズと同じにする方法は?

11
Igor

BorderLayoutのようなレイアウトマネージャーを設定してから、パネルを配置する場所をより具体的に定義できます。

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);

これにより、パネルがフレームの中央領域に配置され、フレームのサイズを変更したときにパネルが自動的に拡大します。

14
Ole

JFrameが使用するレイアウトマネージャーを設定する必要があります-これは、コンポーネントの配置方法を扱います。便利なのはBorderLayoutマネージャーです。

次のコード行を追加するだけで問題が解決するはずです。

mainFrame.setLayout(new BorderLayout());

(JFrameにコンポーネントを追加する前にこれを行います)

2
Richard Walton

友人から提供されたBorderLayoutオプションが機能しない場合は、ComponentListernerをJFrameに追加して、componentResized(event)メソッドを実装してみてください。 JFrameオブジェクトのサイズが変更されると、このメソッドが呼び出されます。したがって、このメソッドでJPanelのサイズを設定するコードを記述すると、意図した結果が得られます。

ええ、私はこの「解決策」が良くないことを知っていますが、それを安全策として使用します。 ;)

1
sv_in

私の経験から、GridLayoutを使用しました。

    thePanel.setLayout(new GridLayout(a,b,c,d));

a =行番号、b =列番号、c =水平方向のギャップ、d =垂直方向のギャップ。


たとえば、次のようなパネルを作成したい場合:

  • 無制限の行(a = 0を設定)
  • 1列(bを1に設定)
  • 垂直方向のギャップ= 3(d = 3に設定)

コードは以下のとおりです。

    thePanel.setLayout(new GridLayout(0,1,0,3));

このメソッドは、JScrollPaneをJPanelに追加する場合に便利です。 JScrollPane内のJPanelのサイズは、それにコンポーネントを追加すると自動的に変更されるため、JScrollPaneは自動的にスクロールバーをリセットします。

1
Luki B. Subekti

他のポスターが言ったように、使用されているLayoutManagerを変更する必要があります。私は常にGridLayoutを使用することを好んだので、コードは次のようになります。

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);

パネルが画面全体を占めるようにする場合、GridLayoutは概念的には正しいように見えます。

0
tddmonkey