2012-11-22 173 views
5

我打算製作一個ContentPanel爲600x600的JFrame,並且我希望JFrame不能重新調整大小。在這個盒子裏面,我繪製了一張600x600的紅色矩形框,以確保當我運行程序時所有的東西都匹配。之前限制調整對JFrame,我做我的設置JFrame的大小:JFrame isResizable(false)尺寸問題

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

當我啓動了程序,我的矩形的邊界與JFrame的尺寸完全適合。但是,當我將isResizable(false)添加到方程中時,似乎在矩形的右邊緣和矩形的底邊之間存在像素緩衝區。通過一些試驗和錯誤,好像isResizable(false)會在高度和寬度上增加10個像素。 (因此,contentPane +額外10的尺寸爲590x590是我的解決方法)

我的問題是爲什麼?我似乎無法找到關於額外10個像素的任何文檔?

注意:通過在不修改大小的情況下製作JFrame也可以觀察到這種異常現象。沒有使其不可調整大小,沒有可觀察的面板/ contentPane,但是當使用isResizable(false)時,面板/窗格中有可見的部分。

+0

前後*重置你確定你把它不可調整大小*調用包? –

回答

5

你是對的,設置一個不可改變的框架似乎增加了10個像素的高度和寬度,至於爲什麼,我不能說,這似乎是更新本地對等的副作用,但是...

您可以通過調用JFrame#pack呼叫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); 
     } 

    } 

}