3

いくつかのグラフィックスと物事を制御するためのいくつかのボタン用に JPanel を含むフォームを作成しています。なんらかの理由で、JPanel の幅を 10 ピクセル低く、高さを 30 ピクセル低く指定する必要があります。この問題の原因は何ですか?

これはコードです:

public class Window {
 public Sheepness sheepness;

 public ButtonPanel buttonPanel;
 public PaintPanel paintPanel;
 public JFrame frame;

 public Window(Sheepness sheepness) {
  this.sheepness = sheepness;

  frame = new JFrame("Sheepness simulation");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //frame.setSize(width, height);

  BorderLayout frameLayout = new BorderLayout();
  JPanel background = new JPanel(frameLayout);
  background.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

  buttonPanel = new ButtonPanel(this);
  background.add(BorderLayout.SOUTH, buttonPanel.buttonBox);

  paintPanel = new PaintPanel(this);
  paintPanel.setPreferredSize(new Dimension(320, 240));
  background.add(BorderLayout.CENTER, paintPanel);

  frame.getContentPane().add(background);
  frame.pack();
  frame.setResizable(false);
  frame.setVisible(true);
 }
}

public class PaintPanel extends JPanel {
 public Window window;

 public PaintPanel(Window window) {
  this.window = window;
 }

 @Override
 public void paintComponent(Graphics g) {
  g.setColor(Color.blue);
  g.fillRect(0, 0, 320, 240);
 }
}

preferredSize が 320 x 240 のスクリーンショット:

ソース画像 http://www.cmbi.ru.nl/~estens/Sheepness/Sheepness_simulation_border.png が見つかりません

320 x 240 の fillRect が JPanel を完全に塗りつぶさず、幅 10 ピクセル、高さ 30 ピクセルの境界線が残っていることがわかります。

preferredSize が 310 x 210 のスクリーンショット:

ソース画像 http://www.cmbi.ru.nl/~estens/Sheepness/Sheepness_simulation_noBorder.png が見つかりません

320 x 240 の fillRect にぴったり収まるようになりました。

何か案は?

4

4 に答える 4

4

レイアウト マネージャーが異なれば、実際のマネージド コントロールのサイズを計算するための規則も異なります。つまり、 「setPreferredSize()」を呼び出した場合にのみ、パネルが特定のサイズになるとは期待できません。

特定のケースごとに使用されるアルゴリズムの詳細については、すべてのターゲット レイアウト マネージャーの javadoc を自由に確認してください。

また、レイアウト マネージャーの使用を避け、 「setBounds()」メソッドを使用してすべてのサイズを絶対的に定義できることにも注意してください。

于 2009-10-20T11:36:08.523 に答える
2

信じられないかもしれませんが、pack()とsetResizeable()の順序を逆にしてみてください

    ...
    frame.setResizable(false);
    frame.pack();  // should be called after any changes
    frame.setVisible(true);

編集:これを使用してチェック

    frame.pack();
    frame.setResizable(false);
    System.out.println(paintPanel.getSize());
    frame.setVisible(true);
    System.out.println(paintPanel.getSize());

    frame.setResizable(false);
    frame.pack();
    System.out.println(paintPanel.getSize());
    frame.setVisible(true);
    System.out.println(paintPanel.getSize());

ただし、サイズが重要でない場合は、実際の領域を次のように埋めることができます。

@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.blue);
    g.fillRect(0, 0, getWidth(), getHeight());
}

[]]

于 2009-10-20T13:36:56.323 に答える
1

コードに基づいた自己完結型のテスト ケースを次に示します。

import java.awt.*;
import javax.swing.*;

パブリック クラス テスト {

 public PaintPanel paintPanel;
 パブリック JFrame フレーム。

 公開テスト() {
  frame = new JFrame("ヒツジシミュレーション");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //frame.setSize(幅、高さ);

  BorderLayout frameLayout = new BorderLayout();
  JPanel background = new JPanel(frameLayout);
  background.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

  paintPanel = 新しい PaintPanel(this);
  paintPanel.setPreferredSize(new Dimension(320, 240));
  background.add(BorderLayout.CENTER, paintPanel);

  frame.getContentPane().add(背景);
  frame.pack();
  frame.setResizable(false);
  frame.setVisible(真);
 }

  public static class PaintPanel extends JPanel {
    パブリック テスト ウィンドウ。

   public PaintPanel(テスト ウィンドウ) {
    this.window = ウィンドウ;
   }

   @オーバーライド
   public void paintComponent(Graphics g) {
    g.setColor(Color.blue);
    g.fillRect(0, 0, 320, 240);
   }
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        新しいテスト();
      }
    });
  }
}

Linux 上の IcedTea JVM で実行すると、これが表示されます

あなたの問題は、ボタン コンテナが強制的にウィンドウを広くしていることが原因であるか、使用している Java のバージョンの Swing バグが原因である可能性があります。

私の推奨事項は、組み込みのレイアウト クラスに煩わされず、代わりに MigLayout を使用することです。

于 2009-10-20T11:33:22.600 に答える
0

スクリーンショットのラベルが間違っていると思います。

指定すれば

g.fillRect(0, 0, 310, 210); 

ペイントパネルと

paintPanel.setPreferredSize(new Dimension(320, 240));

ウィンドウで。最初のスクリーンショットが示していることがわかります。長方形の幅が 10 ピクセル、高さが 30 ピクセル少ないため、これは理にかなっています。

両方に同じ (幅/高さ; 310、210) を設定すると、青い四角形が明らかに PaintPanel を「塗りつぶします」。

于 2009-10-20T11:31:59.333 に答える