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();
    }
4

1 回答 1

1

您忘记设置 LayoutManager,请执行以下操作:

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);
于 2012-11-29T13:41:57.667 回答