2012-11-22 9 views
5

ContentPanelが600x600のJFrameを作成しようとしていましたが、JFrameをサイズ変更できないようにしました。このボックスの中で、600x600の赤い輪郭の四角形を描いて、プログラムを実行したときにすべてが一致することを確認しました。 JFrameのためにリサイズ制限する前に、私は実行して、私のJFrameのサイズを設定します。JFrame isResizable(false)サイジングの問題

getContentPane().setPreferredSize(new Dimension(600,600)); 
pack(); 

をそして私はプログラムを立ち上げ、私の長方形の境界はJFrameのの大きさと完璧にフィットしたとき。しかし、方程式にisResizable(false)を追加すると、私の四角形の右端と私の四角形の下端の間にピクセルのバッファがあるように見えました。小さな試行錯誤で、isResizable(false)がheightとwidthに10ピクセルを追加しているように見えます。 (contentPaneのディメンションが590x590で、余分な10が私の回避策です)

私の質問なぜですか?余分な10ピクセルについてのドキュメントはどこにも見つかりませんでしたか?

注:この異常は、サイズを変更せずにJFrameを作成することによっても確認されました。サイズを変更不可能にすることなく、observableなpanel/contentPaneはありませんが、isResizable(false)を使用すると、パネル/ペインの可視部分があります。

+0

後にコールJFrame#packことによってそれをリセットすることができますか? –

答えて

5

あなたが正しいです、フレームを設定すると、高さと幅に10ピクセルを追加するように見えますが、これはネイティブピアを更新する副作用のようです...

あなたはパックを呼び出す前に* *あなたはそれが非サイズ変更可能にするよろしいです呼び出すJFrame#setResizable

public class TestResizableFrame { 

    public static void main(String[] args) { 
     new TestResizableFrame(); 
    } 

    public TestResizableFrame() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FixedPane()); 
       frame.setResizable(false); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class FixedPane extends JPanel { 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Dimension size = getSize(); 
      String text = size.width + "x" + size.height; 
      FontMetrics fm = g.getFontMetrics(); 
      int x = (getWidth()- fm.stringWidth(text))/2; 
      int y = ((getHeight() - fm.getHeight())/2) + fm.getAscent(); 
      g.drawString(text, x, y); 
      g.setColor(Color.RED); 
      g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); 
     } 

    } 

}