2014-09-26 91 views
0

我有這一段代碼pack()的後奇:JFrame的大小

frame.setTitle("SideScroller"); 
frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
Dimension dim = new Dimension(1000, 500); 
frame.setContentPane(gamePanel);    //gamePanel is an extended JPanel 
gamePanel.setPreferredSize(dim); 
frame.pack(); 

後運行此代碼並填充gamePanel與50x50p份,應填充gamePanel因此frame完全,在屏幕的右側和底部有一些空的像素行。

frame.getSize(); //gives us: 1016 x 539 
frame.getInsets(); //gives: Top: 31 | Left: 8 | Bottom: 8 | Right: 8 

結果的圖像:

JFrame after pack()
正如你可以看到,仍有一些空房間在JFrame

的代碼來填充gamePanel

//Fill the panel with landscape 
//One part : 50x50 px 
//Panel : 1000x500 px 
//Width : 20 prts 
//Height : 10 prts 
@Override 
public void paint(Graphics g){ 
    super.paint(g); 
    for(int i = 0; i < 20; i++){ 
     for(int j = 0; j < 10; j++){ 
      //Decide which landscape-img should be used 
      switch(levelOne[j][i]){ 
       case 0:g.drawImage(new ImageIcon("resources\\landscape-img\\air.png") 
            .getImage(), 50 * i, 50 * j, null); 
        break; 
       case 1:g.drawImage(new ImageIcon("resources\\landscape-img\\ground.png") 
            .getImage(), 50 * i, 50 * j, null); 
        break;    
      } 
     } 
    } 
    g.dispose(); 
} 

我不明白爲什麼frame沒有完全填滿。希望可以有人幫幫我!

+0

好像問題是那些JFrame的插圖。您設置的首選項大小與您返回的大小值之間的差異正是插入內容。所以也許你需要創建一個帶有0值的Insets並調用JFrame.setInsets? – ControlAltDel 2014-09-26 17:50:31

+0

@ControlAltDel現在嘗試,謝謝你的建議。 – ikhebgeenaccount 2014-09-26 17:51:34

+0

我還發現,在其中UI充當了這樣的時候,它可以幫助啓動會與其說setContentPane與面板向後......,如何將它添加到預先存在的contentPane(用正確的佈局)看看這是怎麼回事? – ControlAltDel 2014-09-26 17:52:40

回答

0

找到了答案here。我叫frame.setResizable(false)我叫frame.pack()後,顯然是因爲食堂的frame起來。您必須在pack()(或`setVisible(true))之前調用

4

一些提示,幫助您解決您的問題。

1)如果你需要你的遊戲板具有較好大小,然後只覆蓋getPreferredSize()這樣的:

public class GamePanel extends JPanel { 
    ... 
    @Override 
    public Dimension getPreferredSize() { 
     return isPreferredSizeSet() 
      ? super.getPreferredSize() : new Dimension(1000, 500); 
    } 
    ... 
} 

參見Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

2)要知道,你不應該覆蓋paint()方法,但代替paintComponent()。請參閱A Closer Look at the Paint Mechanism

public class GamePanel extends JPanel { 
    ... 
    @Override 
    protected void paintComponent(Graphics g) { 
     // Your implementation here 
    } 
    ... 
} 

3)已經建議只需添加您gamePanel直接在框架的內容窗格:

frame.getContentPane().add(gamePanel); 

這樣,您將充分利用它的默認佈局管理器組成:BorderLayout,讓您的面板填滿整個中心區域。

4)最後,雖然可以完美使用Swing做遊戲它不這樣做,因爲它是專爲桌面應用的最佳API。你可能要考慮使用一些庫旨在遊戲開發如

+0

我不太瞭解第一點的語法,Eclipse似乎也不明白。你能解釋一下爲什麼用'return'使用'void'?問號? – ikhebgeenaccount 2014-09-27 09:50:23

+0

發現問題標記[here](http://stackoverflow.com/questions/10336899/what-is-a-question-mark-and-colon-operator-within-the-parentheses-of-ap) – ikhebgeenaccount 2014-09-27 10:00:22

+0

這就是什麼問號意味着什麼。關於'void'實際上是一個錯誤(我的錯誤),它應該是'Dimension'。我會盡快解決它。 @ikhebgeenaccount – dic19 2014-09-27 13:08:38