2014-12-14 2 views
0

Я работаю над простой 2D-игрой на Java. Моя проблема в том, что мое окно больше, чем я его установил. Я установил его как 800 x 800, однако, как вы можете видеть на моей картинке, прямоугольник образца, который внизу находится только на 750. Если я ставлю его на 800, он будет отключен от экрана.Почему мой кадр больше, чем я его устанавливал?

Главная

JFrame myFrame = new JFrame(); 
    myFrame.setSize(800,800); 
    world map = new world(); 
    myFrame.add(map); 

Карта

//The only way I can get this to the bottom is setting it to 750. But my window is 800, where 
//did the extra 50 pixels go? 
g2d.draw3DRect(400, 750, 29, 20, true); 

ответ

3

Рамка может быть 800 x 800, но панель, где вы выполняете обычную роспись, меньше, чем потому, что украшения рамки (заголовок и граница) занимают место.

Заканчивать этот маленький кусочек кода, чтобы продемонстрировать это:

import java.awt.*; 
import javax.swing.*; 

public class FrameInfo 
{ 
    public static void main(String[] args) 
    { 
     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     Rectangle bounds = env.getMaximumWindowBounds(); 
     System.out.println("Screen Bounds: " + bounds); 

     GraphicsDevice screen = env.getDefaultScreenDevice(); 
     GraphicsConfiguration config = screen.getDefaultConfiguration(); 
     System.out.println("Screen Size : " + config.getBounds()); 
     System.out.println(Toolkit.getDefaultToolkit().getScreenSize()); 

     JFrame frame = new JFrame("Frame Info"); 
//  JDialog frame = new JDialog(); 
     System.out.println("Frame Insets : " + frame.getInsets()); 

     frame.setSize(200, 200); 
//  frame.pack(); 
     System.out.println("Frame Insets : " + frame.getInsets()); 
     frame.setVisible(true); 

     System.out.println("Frame Size : " + frame.getSize()); 
     System.out.println("Frame Insets : " + frame.getInsets()); 
     System.out.println("Content Size : " + frame.getContentPane().getSize()); 
    } 
} 

Ключ в том, что вы не должны использовать метод SetSize() на раме.

Вместо этого в пользовательской панели переопределить метод getPreferredSize() вернуть 800 х 800, а затем вы вызываете:

frame.pack(); 
frame.setVisible(true); 

Теперь все компоненты будут отображаться в их предпочтительных размеров.

Кроме того, имена классов должны начинаться с символа верхнего регистра. «Карта» должна быть «Карта». Взгляните на Java API, и вы заметите это. Не составляйте свои собственные соглашения!

+0

Ух, я забыл о границах. Это происходит с тех пор. Благодаря! – Movieboy

3

При использовании JFrame.setSize(int width, int height) вы на самом деле установить размер всего окна. это, конечно, включает в себя украшения и заголовок, которые занимают часть пространства. В вашем случае это примерно 50 пикселей. Попробуйте установить внутренние границы JFrame, используя вместо этого getContentPane().setPreferredSize(new Dimension(800,800));.

Редактировать: Вам необходимо позвонить pack() на JFrame где-нибудь, чтобы на самом деле изменить размер окна.

+0

Ну ладно, это с тех пор. Благодаря! – Movieboy

Смежные вопросы