2016-02-02 4 views
0

Я пытаюсь создать PingPong в java, однако у меня возникают проблемы, создающие границы для мяча. После тестирования я обнаружил, что JFrame открывается слишком мало; Я устанавливаю ширину до 500, а JFrame открывается с 484 пикселями. Почему это?Java JFrame Открывается слишком мало

Вот моя игра класс:

общественный класс Game расширяет Canvas {

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

Display d; 


public Game(){ 
    d = new Display(this); 
    requestFocus(); 
} 


public void start(){ 
    System.out.println("Game started."); 
} 
public void stop(){ 

} 


public void paint(Graphics g){ 
    g.setColor(Color.DARK_GRAY); 
    g.fillRect(0, 0, 500, 400); 
    g.setColor(Color.GREEN); 
    g.drawLine(483, 0, 483, 399); 
    g.drawLine(0, 399, 499, 399); 
} 

}

Вот мой JFrame класс:

общественного класса Display расширяет JFrame {

JFrame frame; 
Dimension screenSize; 

public Display(Game game){ 
    frame = new JFrame("PingPong"); 
    screenSize = new Dimension(500, 400); 



    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setResizable(true); 
    //frame.setSize(500, 400); 
    frame.setPreferredSize(screenSize); 
    frame.setMinimumSize(screenSize); 
    frame.setMaximumSize(screenSize); 

    frame.setLocationRelativeTo(null); 
    frame.add(game); 
    //frame.pack(); 
    game.start(); 

} 

}

ответ

1

Когда вы звоните setSize по номеру JFrame, он включает в себя размер строки заголовка, а также любое другое украшение вокруг окна. Таким образом, фактическая область вытягивания у вас будет немного меньше. Вы можете обойти это, установив нужный размер Game и используя pack на JFrame.

Так что, если вы измените свой код на этот:

public Display(Game game){ 
    super("PingPong"); 
    screenSize = new Dimension(500, 400); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(true); 
    game.setPreferredSize(screenSize); 

    setLocationRelativeTo(null); 
    add(game); 
    pack(); 
    setVisible(true); 
    game.start(); 
} 

Он будет работать. Это говорит о вашей реальной игре, какой размер он хочет (500x400), а затем имеет размер кадра, чтобы он мог полностью его содержать. Это даст вам 500x400 пикселей для работы с вашим фактическим рисунком.

Обратите внимание, что я удалил все ссылки frame. Поскольку Display сам уже есть JFrame, вам не нужно создавать другой. Просто используйте объект Display.

+0

Как именно я это сделал? Я довольно новичок в разработке игр в java – Lol

+0

@Lol: Взгляните на этот [ответ на вопрос о стекировании] (http://stackoverflow.com/a/35002727/300257). Это не пинг-понг, но он показывает, как правильно рисовать в Java Swing. Кроме того, посмотрите на [Выполнение пользовательской живописи] Oracle (https://docs.oracle.com/javase/tutorial/uiswing/painting/), чтобы увидеть другой пример. –

+0

@Lol Это довольно легко. Глядя на ваш код, я вижу, что на самом деле у вас это довольно близко. Вам просто нужно изменить 'frame.setPreferredSize (screenSize)' на 'game.setPreferredSize (screenSize)', закомментировать строки 'setMinimumSize' и' setMaximumSize' и раскомментировать 'frame.pack()'. Я добавлю, что будет похоже на мой ответ. – resueman

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