2012-07-05 43 views
0

我正在嘗試使用JPanle和JFrame編寫遊戲。我在一個框架內設置了一個面板。當我在面板上繪製矩形大小的面板爲0,0時。矩形向上移動並留下一些像素。我該如何解決這個問題?我搜索了一下,我看到了插入方法,但我不想每次繪製時都使用它來計算我的座標。JPanel和JFrame座標搞砸了

這裏是代碼

public class Game extends JFrame{ 

public Game(){ 
    this.getContentPane().setPreferredSize(new Dimension(800,600)); 
    pane p = new pane(); 
    this.getContentPane().add(p,BorderLayout.CENTER); 
    p.setPreferredSize(new Dimension(800,600)); 
    pack(); 
    setResizable(false); 
    setVisible(true); 


} 


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

} 

public class pane extends JPanel{ 

public pane(){ 

setDoubleBuffered(false); 
setBackground(Color.black); 
setPreferredSize(new Dimension(800, 600)); 

setFocusable(true); 
requestFocus(); 
} 

@Override 
public void paint(Graphics g) { 
    g.setColor(Color.white); 
    g.fillRect(0, 0, 800, 600); 
    g.setColor(Color.black); 
    g.fillRect(0, 0, 800, 600); 

} 
} 

screen shot link

+0

setDoubleBuffered(false);通常只會導致閃爍 – 2012-07-05 09:51:13

+1

請學習java命名約定並堅持使用它們在Swing中實現自定義繪畫的方法是paintComponent(_not_ paint) – kleopatra 2012-07-05 09:52:25

+0

我知道命名約定,但我懶得在測試代碼示例中做到這一點,對此感到遺憾。 – user1503395 2012-07-05 18:40:23

回答

1

其實沒有你的面板的轉變,它位於0,0。問題在於面板實際尺寸爲810,610而不是800,600。出於某種原因(迄今爲止我無法找到,如果有人有一個想法我很想學習),當你在JFrame上調用setResizable(false)時,它的插入符會被修改,並最終導致你的內容窗格比預期的更大(至少在JDK6/Win7上)。在添加組件和包裝框架之前,請致電setResizable(false),它可以正常工作。

也可以考慮繪畫的面板尺寸的g.fillRect(0, 0, getWidth(), getHeight());矩形(讓你一定要填滿整個區域,無論發生什麼事情。

任何理由用白色填充顏色的背景,然後取代它用黑色?

+0

給出+1,完全w 「_g.fillRect(0,0,getWidth(),getHeight()_」 – padman 2012-07-05 09:35:51

+0

我們可以添加「_setUndecoratied(true)_」來隱藏額外的空間代碼 – padman 2012-07-05 09:38:17

+0

感謝,setResizable作品,但我不知道它爲什麼這樣做。重點不在於畫出整個畫面,我只是希望有精確的座標來繪畫,而不是讓我的繪畫偏移。並且使用setUndecoratied將隱藏標題欄和按鈕。 – user1503395 2012-07-05 18:53:48