2013-05-14 20 views
1

我必須說我嘗試了一切,我不明白我的代碼有什麼問題。 在我的SIView類中,我創建了MainFrame,它使用指定的分辨率(假設爲X,Y)來擴展JFrame。 然後,我創建了gamePanel,它的擴展名爲JPanel,其分辨率與MainFrame相同,並將其添加到MainFrame。問題是面板的有效分辨率是兩倍大(x * 2,y * 2)。這就像面板被拉伸了兩倍。JPanel看起來比設置的分辨率大兩倍

框架將只顯示面板的四分之一(左上四分之一),或者用pack()或mannualy設置大小,除非我將它設置爲分辨率的兩倍,在這種情況下可以,但這不是一個正確的方法(在計算遊戲中的位置時,我必須加倍所有或將它除以2以保持適當的比例)。我甚至嘗試過不同的佈局管理器,無需任何成功。

這裏的主視圖類的代碼:

public class SIView implements Runnable { 

private final MainFrame mainFrame; 
private final GamePanel gamePanel; 

public SIView(BlockingQueue<SIEvent> eventQueue) { 
    this.eventsQueue = eventQueue; 
    mainFrame = new MainFrame(); 
    gamePanel = new GamePanel(); 

    gamePanel.setVisible(true); 
    mainFrame.getContentPane().add(gamePanel); 
    // mainFrame.pack(); 



@Override 
public void run() { 
    mainFrame.setVisible(true); 
} 

public void init() { 
    SwingUtilities.invokeLater(this); 

} 
    //some code not related 

} 

幀類:

public class MainFrame extends JFrame { 
/** 
* 
*/ 
private static final long serialVersionUID = 6513420589842315661L; 

public MainFrame() { 
    setTitle("Space Intruders"); 
    setSize(new Dimension(SIParams.RES_X, SIParams.RES_Y)); 
    setResizable(false); 
    setLayout(null); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
} 

面板類:

public class GamePanel extends JPanel { 

/** 
* 
*/ 
private static final long serialVersionUID = 8112087715257989968L; 

private final PlayerShipView playerShip; 
private final ArrayList<SmallEnemyShipView> smallEnemyShip; 
private final ArrayList<LightMissleView> lightMissle; 

public GamePanel() { 
    setPreferredSize(new Dimension(SIParams.RES_X, SIParams.RES_Y)); 
    setMaximumSize(new Dimension(SIParams.RES_X, SIParams.RES_Y)); 
    setBounds(0, 0, SIParams.RES_X, SIParams.RES_Y); 
    setBackground(new Color(0, 0, 0)); 
    setLayout(new OverlayLayout(this)); 

    setDoubleBuffered(true); 
    // TODO 
    playerShip = new PlayerShipView(); 
    smallEnemyShip = new ArrayList<SmallEnemyShipView>(); 
    lightMissle = new ArrayList<LightMissleView>(); 
    this.add(playerShip); 

} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
} 

//some code not related 
} 
+3

1)爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)Java GUI可能需要在多種平臺上工作,使用不同的屏幕分辨率並使用不同的PLAF。因此,它們不利於組件的準確放置。對於可靠的GUI,改爲使用佈局管理器或它們的組合,以及用於空白的佈局填充和邊框來組織組件。 3)不要設置頂級容器的大小。而是佈置內容並調用'pack()'。 – 2013-05-14 08:20:24

+0

旁白。那些言辭不含'?'。你有問題嗎? – 2013-05-14 08:23:11

+0

要清除它,如果將參數中的硬編碼數字(例如100,100和麪板50 * 50)放在硬盤上,會發生什麼情況?如果它仍然使參數增加一倍,那麼面板將會是相同的尺寸,這是否會發生,或者它是否正確設置。如果是這樣的話,SIParams可能會做一些奇怪的事情。 – Skillcoil 2013-05-14 08:23:31

回答

2

如果我使用LayoutManager並適當重寫getPreferredSize()在代碼似乎按預期工作:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

import org.jfree.ui.OverlayLayout; 

public class SIView implements Runnable { 

    public static interface SIParams { 

     int RES_X = 500; 
     int RES_Y = 400; 
    } 

    public static class GamePanel extends JPanel { 
     public GamePanel() { 
      setBackground(new Color(0, 0, 0)); 
      setLayout(new OverlayLayout()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(SIParams.RES_X, SIParams.RES_Y); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
     } 

     // some code not related 
    } 

    private JFrame mainFrame; 
    private GamePanel gamePanel; 

    @Override 
    public void run() { 
     mainFrame = createMainFrame(); 
     gamePanel = new GamePanel(); 
     mainFrame.getContentPane().add(gamePanel); 
     mainFrame.pack(); 
     mainFrame.setVisible(true); 
    } 

    private JFrame createMainFrame() { 
     JFrame frame = new JFrame(); 
     frame.setTitle("Space Intruders"); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     return frame; 
    } 

    public void init() { 
     SwingUtilities.invokeLater(this); 

    } 

    // some code not related 

    public static void main(String[] args) { 
     new SIView().init(); 
    } 

} 

我也放棄了MainFrame類,因爲它不需要在這種情況下延長JFrame

+0

不幸的是,效果是一樣的,我仍然可以將我的船置於RES_Y和RES_X範圍內的框架之下。我可能沒有足夠的解釋。幀大小是完美的,它是超出幀邊界的面板。是的,我相信這不是船運動的問題,因爲我顯示了它的位置,並且它保持在給定值內。 – Muniu 2013-05-14 14:28:38

+0

它的行爲像面板上的像素表示不是1x1而是2x2。 – Muniu 2013-05-14 14:29:40

+0

@MichałMuniuMajczak_And是的,我相信這不是船運動的問題_我其實認爲你的問題在於你沒有向我們展示的東西。我真正確定的是,我上面提供的代碼沒有問題。考慮使用[SSCCE](http://sscce.org)更新您的代碼。問題可能出現在你的'LayoutManager'或你的'paintComponent'中。根據您迄今提供的信息,沒有人能夠爲您提供更多幫助。 – 2013-05-14 15:04:35

0

我剛剛解決了一切:D但我必須說我感到很蠢。問題在於繪製我的組件,在paintcomponent()方法中,我在相對位置上繪製矩形,同時相對更改組件位置。這給了2xtimes移動等等的效果,因爲當組件移動時,矩形也移動了。我想我有很多要了解Swing;)抱歉,所有這些麻煩;)

PS。除了在所有事情之後使用pack()方法外,我不必更改Panel/Frame類中的任何內容。