2016-02-21 61 views
-1

我搞砸了一些代碼,並遇到了假設找到窗口的「最佳」大小的包方法。但是當我嘗試出來時,儘管我在調用pack()之前繪製了一個圓圈,但它只是儘可能小的一個窗口。這是爲什麼? pack()查找哪些元素?我也經常發現使用pack()和setSize()的代碼,Oracle明確表示不這樣做。既然他們都設置了大小,那麼它有什麼意義呢pack()如何工作,它看起來是什麼

下面是代碼的一部分櫃面這是我是誰做錯了什麼:

public void paint(Graphics g) { 
     super.paint(g); 
     g.fillOval(x, y, 30, 30); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame("Extreme Pong"); 
     Game game = new Game(); 
     frame.add(game); 
     frame.pack(); 
} 

編輯: 很顯然,我不是不明白你們中的大多數,因爲鏈接的答案,「重複」做不回答我的問題。瘋狂的程序員確實回答了我的問題,所以非常感謝你。

+4

包()依賴於組件的首選尺寸。如果使用JPanel子類進行繪製,則應該重寫paintComponent()而不是paint(),並且應該重寫getPreferredSize()。 –

+0

Oracle說不要覆蓋paintComponent,而是使用paint,因爲它調用所有的paint(包括paintComponent)。另外爲什麼我會重寫一個getter?另外我如何使用它來使包裝正常工作? – LegoNinja39

+2

*「Oracle說不覆蓋paintComponent並使用paint代替..」* Oracle在哪裏提供建議?請鏈接.. –

回答

2

pack利用佈局管理器API,並「要求」框架的contentPane爲它的preferredSize,這使得pack爲「包」的窗口內容周圍的裝飾。您必須記住,窗口大小包含窗口裝飾,所以800x600的窗口將具有明顯更小的可視區域

如果您將組件添加到大小未定義的框架(在JComponentJPanel的情況下其返回的0x0preferredSize,該框架將被打包到其最小可能大小,不是你想要的真的是。

因此,舉例來說,像...

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.fillOval(10, 10, 30, 30); 
      g2d.dispose(); 
     } 

    } 

} 

產生的200x222窗口在我的Mac上,但TestPane200x200

你可能也想看看Laying Out Components Within a ContainerPainting in AWT and SwingPerforming Custom Painting的一些細節

+0

好吧,我認爲包方法正在尋找實際元素,然後相應地調整它。感謝你的回答! – LegoNinja39

-2

使用.pack()和.setSize()沒有意義,完全取決於哪一個是最後一個代碼,但我推薦使用:

frame.setMinimumSize(new Dimension(x,y)); 

請不要忘記補充:

frame.setVisible(true); 
+0

不要在框架上設置最小尺寸。相反,重寫其內容的'getXXXSize'。哦,他的名字不是奈梅蒂。 – user1803551

+0

然後重寫'getMinimumSize'。 – user1803551

+0

除了你想要做到這一點,它沒有任何優先權。 –

相關問題