3

ですから、私はGUIにかなり慣れていないので、好みのサイズを(経由でsetPreferredSize(new Dimension(width, height)))設定する10と、幅と高さの両方が増えるという問題に遭遇しました。私は疑問に思っていました、なぜこれが起こるのですか?はい、「お好みのサイズ」であることは承知しておりますが、これを防ぐ方法は確かにあります。メソッドに渡す前に幅と高さから減算するだけで修正できますが10、何が起こっているのか疑問に思いました。

私の(関連する)コード:

主な方法:

 public static void main(String[] args)
 {
    final App app = new App(500, 500);

    JFrame frame = new JFrame("Block Stacker 3000");
    frame.getContentPane().add(app);
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    System.out.println(app.getSize());
    app.start();
 }

アプリコンストラクター(JPanelを拡張):

  public App(int width, int height)
  { 
     this.width = width;
     this.height = height;

     System.out.println(width + " " + height);

     setPreferredSize(new Dimension(width , height));

     setBackground(Color.CYAN);
  }

実行すると、次のように出力されます。

500 500
java.awt.Dimension[width=510,height=510]

また、使ってみましsetMinimumSize()setMaximumSize()が、どちらも実際には何の影響もありませんでした。

4

3 に答える 3

3

のサイズはJPanel、コンテナー内のコンポーネントを処理するレイアウト マネージャーによって決定されます。 JFrameデフォルトのレイアウトマネージャーがあるため、設定していなくても存在します。好みのサイズに注意を払うレイアウト マネージャーもいれば、気にしないレイアウト マネージャーもいます。他のレイアウト マネージャーよりも最小/最大サイズに注意を払う人もいます。

「絶対配置」とも呼ばれる「ヌルレイアウトマネージャー」を設定し、すべてのサイズを自分で制御できますが、それをしようとはしていないと思います(「優先」サイズを設定しているため)。UI を設計するために必要なことは、必要な相対サイズと位置、およびウィンドウのサイズが変更されたときにどうしたいかを理解することです。これにより、どのレイアウト マネージャーが、どのコンテナー パネルおよびそれらを含むコンテナー パネルに移動するかが決まります。

そして、基本的にレイアウトマネージャーにそのことを行うように指示することを排除frame.pack();しません。通常、レイアウトマネージャーに、必要な方法でセットアップしたら、レイアウトマネージャーに処理させたいと思います...

于 2013-01-04T04:22:15.863 に答える
2

コードをコピーして貼り付けたところ、次の出力が得られました。

500 500
java.awt.Dimension[width=510,height=530]

しかし、その後、フレームのスクリーンショットを撮りました。

ここに画像の説明を入力

画像をダウンロードしてファイルのプロパティを確認すると、幅が 502 ピクセル (ウィンドウの細い境界線が 1 ピクセルであるため)、高さが 531 ピクセル (ウィンドウのタイトル バーが高さ 31 ピクセルであるため) であることがわかります。 gimp を使用すると、シアンの領域が実際には500x500ピクセルの幅であることがわかりました。

更新:setResizable(false)文を次の行に 移動しframe.setVisible(true);ます:

    JFrame frame = new JFrame("Block Stacker 3000");
    frame.getContentPane().add(app);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(false);

その後、次のように出力されます。

500 500
java.awt.Dimension[width=500,height=500]
于 2013-01-04T04:28:59.463 に答える