Проблем с оформлението на играта Swing

Работя върху внедряването на игра в слоести панели и се натъквам на някои проблеми с оформлението. По някаква причина нищо не се подрежда правилно. В крайна сметка получавам бяло пространство в горната част на моята рамка и рамката никога не се разширява до правилния размер, за да пасне на всичко. Опитах 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();
    }

person Community    schedule 15.11.2012    source източник
comment
Ааа! Твърде много код! Бихте ли предоставили SSCCE? sscce.org   -  person tckmn    schedule 15.11.2012
comment
@PicklishDoorknob Изображенията също са проблем за създаване на SSCCE. OP ще трябва да направи нещо като a) Гореща връзка към малки (в байтове) изображения. б) Генерирайте ги в код. c) Вместо това заменете J2SE компоненти, които показват същия проблем с оформлението. -- Като се има предвид това, подозирам, че проблемите се дължат на използването на JLayeredPane, който по памет игнорира всички указания за размера на съдържанието (или поне няма мениджър на оформление по подразбиране).   -  person Andrew Thompson    schedule 15.11.2012
comment
@AndrewThompson хаха, всички винаги ми казват да използвам такъв, но когато се опитам да кажа на други хора, не работи :P   -  person tckmn    schedule 15.11.2012
comment
ImageIO.read(new File("images/Raindrop.png")); Не е свързано с непосредствения проблем, но по време на внедряването това вероятно ще бъде вграден ресурс, който ще да бъде достъпен само чрез. URL адрес. Вижте Wiki за маркери за вградени ресурси за това как да формирате URL.   -  person Andrew Thompson    schedule 15.11.2012
comment
@PicklishDoorknob Не, коментарът ти беше на място. Ако не друго, това е документът, който липсва. Написах го, но често добавям тези същите видове предупреждения към съвета за публикуване на SSCCE код, който се занимава с изображения. Моля, продължавайте да съветвате SSCCE. Ако е свързано с изображения и можете да намерите мотивацията, добавете съвети как да пренаредите откъде се зареждат. :)   -  person Andrew Thompson    schedule 15.11.2012
comment
Не виждам причина защо вашият основен панел се нуждае от многослоен панел. Единствените панели, които мога да се възползвам от началните наслоени панели, са дъската и небето, останалото може да се оформи с мениджър на оформление. Освен това бих използвал много повече предпочитания размер - IMHO   -  person MadProgrammer    schedule 15.11.2012
comment
Използвам многослойни стъкла, така че когато внедрявам интро екран и екран с табло, мога просто да донеса тези стъкла отпред или да ги бутна назад, когато са необходими.   -  person    schedule 15.11.2012
comment
@Requiem След това използвайте CardLayout, за да превключвате между групите. LayeredPane е над убийството - IMHO - Това е добър избор за небето и борда, но не и за останалата част от играта...   -  person MadProgrammer    schedule 15.11.2012
comment
Така че цялата игра трябва да се основава на оформление на карти, след което да превключвате между различните сцени, предполагам, че можете да ги наречете? Като меню, към игра, към табло? Изобщо не съм запознат с оформлението на карти. Има ли уроци, които бихте предложили?   -  person    schedule 16.11.2012


Отговори (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);
person OblongZebra    schedule 29.11.2012