2

これは、JFrameをインスタンス化するために使用しているコードのサンプルです。

public class TestFrame{
public static void main(String[] args){
    JFrame frame = new JFrame();
    Insets insets = frame.getInsets();
    frame.setSize(new Dimension(insets.right + insets.left + 400, insets.bottom + insets.top + 400));
    System.out.println(String.format("Top = %d \nBottom = %d \nLeft = %d \n Right
            = %d", insets.top, insets.bottom, insets.left, insets.right));

    frame.setResizable(false);
    frame.setVisible(true);
}
}

フレームは正常に表示されていますが、すべての挿入図はゼロに等しいようです。サイズ400x400のコンテンツペインが正確に必要なので、上部のタイトルバーのサイズを知る必要があります。

複数のプラットフォームでテストしましたが、WindowsとMacでも同じことが起こります。

私は何を間違っているのですか?

4

5 に答える 5

5
  1. コンテンツペインを正確に400x400にしたい場合は、preferredSizeを400x400に設定することを検討します(ただし、コンテンツペインで優先サイズを強制したくない場合は、許容できる場合があります)。
  2. その好みのサイズを設定した後、フレームを表示する前に、フレームを呼び出しますpack()

これは最もクリーンで簡単なソリューションであり、境界線のはめ込みを気にする必要はありません。

于 2012-10-03T15:37:13.937 に答える
5

contentPaneを正確に400x400にする必要がある場合は、これをpreferredSizeに戻すクラスを作成し、contentPaneとして使用します。

class MyContentPane extends JPanel {
   public static final int PREF_W = 400;
   public static final int PREF_H = 400;

   public Dimension getPreferredSize() {
     return new Dimension(PREF_W, PREF_H);
   }
}

またはおそらくより良い:

class MyContentPane extends JPanel {
   public int prefW;
   public int prefH;

public MyContentPane(int prefW, int prefH) {
   this.prefW = prefW;
   this.prefH = prefH;
}

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

他のポスターで述べられているようpack()に、トップレベルのウィンドウで使用し、レイアウトマネージャーを使用する必要があります。

私自身はこれを行うのではなく、さまざまなコンポーネントの実際の優先サイズとコンテナのレイアウトマネージャにすべての決定を任せることを好みます。

于 2012-10-03T15:37:21.343 に答える
2

何を扱っているのか誤解しているので、「間違っている」ように見えます。

挿入図は、コンテンツペインの外側にある「もの」の寸法ではありません。これらは、コンテンツペインの周囲の「境界線」に似ており、描画は許可されません。境界線とは異なり、はめ込みは重なりません。

窓の周りの装飾のサイズは、プログラムによって決定されません。これは、フォーカスとウィンドウナビゲーションを処理する別のプログラムによって決定されます。そのプログラムはウィンドウマネージャーと呼ばれます。「上部のタイトルバー」とその高さ、フォントなどを処理するのはウィンドウマネージャーです。

「正確なサイズ」のプログラムを取得するには、ウィンドウマネージャにフレームのないウィンドウを要求する必要があります。これはJavaで実行できます。上部にタイトルバーはなく、端の近くにサイズ変更ハンドル、ウィンドウコマンドメニュー、閉じるための赤い「x」、またはデスクトップ上でウィンドウを移動する手段もありません(ただし、プログラムはそれ自体を再配置できます)そうするように書かれている場合)。

別の方法は、適切なサイズとルートペインウィンドウで排他的な「画面」を要求することです。これは、ゲームで行われることもありました。それは物事を行うためのより制限的な方法であり、解像度はサポートされている画面サイズに制限されています。

ウィンドウ全体を特定のサイズにするのではなく、コンテンツペインを特定のサイズにする必要がある場合は、コンテンツペインの推奨サイズを扱う他の優れた回答を参照してください。

于 2012-10-03T15:39:51.897 に答える
2
  1. パネルでUIを作成します。
  2. パネルの希望するサイズを設定します。
  3. パネルをフレームに追加して呼び出しますpack()
于 2012-10-03T15:38:43.297 に答える
0
  • BorderLayout(でpre_implemented JFrame API)無視するInsetsには、

  • ほとんどLayoutManager無視Insetsしますが、必要なのはAbsoluteLayout

基本的で一般的なもの

  • JFrame(およびのほとんど)は、、、のみをContainers返すことができますInsetsBoundsSize

    a)すでに表示されているコンテナから

    b)電話後JFrame(e.i.)#pack()

  • その場合、ほとんどの場合、逆効果以上の、、、の設定になりInsetsます。BoundsSizeXxxSize

    a)ほとんどの場合、親にJComponents適切なものを返すことができます。PreferredSize

  • ただし、

    a) Graphics(2D)

    b)空のコンテナの場合

    c)JScrollPane& 、コンテナでサイズ変更可能JList / JTableな場合、独自のコードモンストラムを生成することには逆効果がありますJScrollPane

于 2012-10-03T16:17:26.417 に答える