2012-11-15 119 views
0

我正在实现分层窗格中的游戏,我遇到了一些布局问题。出于某种原因,没有正确排列。我最终在我的框架顶部留出了一个空白区域,并且框架永远不会扩展到正确的大小以适合所有内容。我已经尝试过frame.pack(),因为我之前已经做过(没有分层面板),但似乎也没有工作。摆动游戏布局问题

如果有人能帮助我,我会很感激。我有一种感觉,那就是我缺少的东西。

public class gameGUI extends JFrame{ 

//set up all the variables that will be used in the gameGUI 
static int skyWidth = 1024; 
static int skyHeight = 120; 
static int sidebarWidth = 120; 
static int sidebarHeight = 480; 
static int boardWidth = 904; 
static int boardHeight = 480; 
private JLayeredPane pane = new JLayeredPane(); 
public static YardDriver thisDriver; 
public static int getScreenWidth(){return boardWidth;} 
public static int getScreenHeight(){return boardHeight;} 

public JLayeredPane getPane(){ 
    return pane; 
} 


//Convert the width of the screen to work with the gui 
public int convertX(int rainLoc,BufferedImage img){ 
    int x = rainLoc % 30; 
    return ((boardWidth-img.getWidth())*x)/YardDriver.getScreenWidth(); 
} 

//Convert the height of the screen to work with the gui 
public int convertY(int rainLoc, BufferedImage img){ 
    int y = (rainLoc - (rainLoc % 30))/30;  
    return ((boardHeight-img.getHeight())*y)/YardDriver.getScreenWidth(); 
} 

//Convert the screen to the board 
public static int convertStoB(Point screenLoc){ 
    int y = ((screenLoc.y - skyHeight) * YardDriver.getScreenHeight())/boardHeight; 
    int x = ((screenLoc.x - sidebarWidth) * YardDriver.getScreenWidth())/boardWidth; 
    return x + y*YardDriver.getScreenWidth(); 
} 

private void loadAll() { 

} 

public gameGUI() { 
    loadAll(); 

    JPanel timer = new JPanel(); 
    //place the image in a jlabel and set bounds 
    timer.add(sky); 
    //Set preferredsize, border, and set opaque 
    timer.setPreferredSize(new Dimension(skyWidth,skyHeight)); 
    timer.setBounds(0, 0, skyWidth, skyHeight); 
    timer.setOpaque(true); 
    timer.setBorder(BorderFactory.createLineBorder(Color.BLACK,2)); 

    JPanel sidebar = new JPanel(); 
    sidebar.setBounds(0, skyHeight, sidebarWidth, sidebarHeight); 
    JButton nativeOne = new JButton(); 
    JButton nativeTwo = new JButton(); 
    JButton nativeThree = new JButton(); 
    JButton exoticOne = new JButton(); 
    JButton exoticTwo = new JButton(); 
    JButton exoticThree = new JButton(); 
    //Set the preferredsize and set a border 
    sidebar.setLayout(new GridLayout(6, 1)); 
    sidebar.setPreferredSize(new Dimension(sidebarWidth, sidebarHeight)); 
    //Add each button to the sidebar 
    sidebar.add(nativeOne); 
    sidebar.add(nativeTwo); 
    sidebar.add(nativeThree); 
    sidebar.add(exoticOne); 
    sidebar.add(exoticTwo); 
    sidebar.add(exoticThree); 
    sidebar.setBorder(BorderFactory.createLineBorder(Color.BLACK,2)); 

    JPanel board = new gamePanel(this); 
    board.setBounds(sidebarWidth, skyHeight, boardWidth, boardHeight); 
    board.setPreferredSize(new Dimension(904, 480)); 
    board.setBorder(BorderFactory.createLineBorder(Color.BLACK,2)); 

    timer.setVisible(true); 
    sidebar.setVisible(true); 
    board.setVisible(true); 

    pane.add(timer, new Integer(1)); 
    pane.add(sidebar, new Integer(1)); 
    pane.add(board, new Integer(1)); 
    pane.setBounds(0,0,1024, 600); 

    setTitle("Storm Watch"); 
    setSize(1024, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //Pack the frame and set it to visible 
    setVisible(true); 
    setContentPane(pane); 

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

     //Create a new frame with the createAndShowGUI 
     JFrame frame = new gameGUI(); 
    } 
+2

啊!代码太多!你能提供一个SSCCE吗? http://www.sscce.org – Doorknob

+1

@PicklishDoorknob这些图片也是制作[SSCCE](http://sscce.org/)的一个问题。 OP将需要做一些事情,如a)热点链接到小(以字节为单位)的图像。 b)用代码生成它们。 c)用J2SE组件代替,显示相同的布局问题。 - 这就是说,我怀疑这些问题是由于使用了'JLayeredPane',它从内存中忽略了所有内容大小提示(或者默认情况下至少没有布局管理器)。 –

+1

@AndrewThompson哈哈,每个人总是告诉我使用一个,但当我试图告诉其他人它不起作用:P – Doorknob

回答

1

你忘了设置布局管理,做这样的事情:

this.pane.setLayout(new BorderLayout()); 
this.pane.add(timer, BorderLayout.PAGE_START); 
this.pane.add(sidebar, BorderLayout.LINE_START); 
this.pane.add(board, BorderLayout.CENTER);