我正在分层窗格中实现游戏,我遇到了一些布局问题。由于某种原因,没有任何正确的排队。我最终在我的框架顶部有一个白色空间,框架永远不会延伸到正确的尺寸以适应所有东西。我已经尝试过frame.pack(),因为我之前已经完成了(没有layeredpanes),但这似乎也没有用。
如果有人可以帮助我,我会很感激。我觉得有一些小东西我不见了。
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();
}
答案 0 :(得分: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);