0

私は次のことをしようとしていますが、どのタイプの Java レイアウトを使用すればよいかわかりません。

JFrame単板で欲しいtotalPaneltotalPanel私が作成したカスタム クラスである 2 つのパネルとPanelA、PanelB を含める必要があります。PanelA高さ 200 からPanelB開始し、高さ 400 から開始します。ユーザーがウィンドウを拡大するかウィンドウのサイズを変更するとPanelB、高さだけが増加しますが、両方のパネルの幅が増加する可能性があります。

どうすればこれを設定できますか? BorderLayout を使用しようとしましたが、「北」は常に高さが小さすぎます。BoxLayout を使用しようとしましたが、両方ともPanelA常にPanelB同じ高さです。

4

4 に答える 4

4

totalPanel で BorderLayout を使用することを検討してください。PanelA を BorderLayout.PAGE_START 位置に追加し、PanelB を BorderLayout.CENTER 位置に追加します。

レイアウト マネージャーの詳細については、チュートリアルを参照してください:レッスン: コンテナー内のコンポーネントのレイアウト

編集:BorderLayoutを使用したことがわかりましたが、「機能しません」が、コードは表示されません。機能しない理由をさらに微調整するには、コードを示すことを検討してください。

getPreferredSize()これを機能させるには、JPanels の初期サイズを設定するのに役立つPanelX クラスのオーバーライドを与えることを検討してください。

例えば:

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.*;

public class SimpleGuiLayout {

   private static void createAndShowGui() {
      JPanel totalPanel = new JPanel(new BorderLayout());

      totalPanel.add(new PanelX(800, 200, "Panel A"), BorderLayout.PAGE_START);
      totalPanel.add(new PanelX(800, 400, "Panel B"), BorderLayout.CENTER);
      JFrame frame = new JFrame("Simple Gui Layout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(totalPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class PanelX extends JPanel {
   private int prefW;
   private int prefH;

   public PanelX(int prefW, int prefH, String title) {
      this.prefW = prefW;
      this.prefH = prefH;
      setBorder(BorderFactory.createTitledBorder(title));
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }
}

実行すると、次のようになります。
ここに画像の説明を入力

そして、適切にサイズ変更します。

于 2012-09-20T23:30:08.207 に答える
3

1 つのアプローチ (おそらく最も単純ではない) は、GridBagLayout です。

サイズを変更できるメンバーを制御するには、weightx および weighty 制約を使用します。

于 2012-09-20T23:32:30.310 に答える
3

GridBagLayout をお勧めします。使い方は複雑ですが、問題を解決できます。panelA が panelB の上にあると仮定すると、次の制約があります。

  • panelA と panelB の gridx は 0 になります
  • panelA は ad gridy 0 になり、 panelB は gridy 1 になります
  • 両方の場合、fill = BOTH を設定します。
  • ただし、panelB の高さのみを増加させるには、panelB の weighty を 1.0 に設定し、panelA を 0 に設定します。
于 2012-09-20T23:33:23.477 に答える