2013-02-28 2 views
0

Я пытаюсь запрограммировать игру, но я не могу сделать точно большое окно, в котором я нуждаюсь. Первый println дает мне 720 и второй 732, а окно действительно больше 720. Как я могу отображать игру с точностью до 720 пикселей?Java JFrame точно не соответствует размеру

xCopterGame.java

import javax.swing.JFrame; 
import java.awt.Dimension; 
import java.awt.event.*; 

public class xCopterGame extends JFrame implements MouseListener{ 

    private static final long serialVersionUID = 1L; 

    Board panel=null; 
    public xCopterGame(){ 
    panel = new Board(); 
    setTitle("Pong"); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    panel.setPreferredSize(new Dimension(1280,720)); 
    getContentPane().add(panel); 
    pack(); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    setResizable(false); 

    System.out.println(panel.getHeight()); 

    panel.yCopter = getHeight()/2-15; 

    panel.addMouseListener(this); 
    addMouseListener(this); 
    } 

    public void mousePressed(MouseEvent e) { 
    panel.mousePressed(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
    panel.mouseReleased(e); 
    } 

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


    public void mouseClicked(MouseEvent e) { 

    } 
    public void mouseEntered(MouseEvent e) { 

    } 
    public void mouseExited(MouseEvent e) { 

    } 
} 

Board.java

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import javax.swing.JPanel; 

public class Board extends JPanel implements Runnable{ 
    private static final long serialVersionUID = 1L; 

    Thread th=null; 
    boolean mousePressed = false, firstClick = false; 
    int yCopter; 

    public Board(){ 
    th = new Thread(this); 
    th.start(); 
    } 

    public void paint(Graphics g){ 
    super.paint(g); 
    this.setBackground(Color.black); 
    g.setColor(Color.white); 
    g.fillRect(80, yCopter, 30, 30); 

    g.setColor(Color.gray); 
    for(int i=0; i<37; i++){ 
     g.drawLine(0, i*20, this.getWidth(), i*20); 
    } 

    g.fillRect(100, 715, 30, 5); 
    g.fillRect(100, 0, 30, 5);  
    System.out.println(this.getHeight()); 
    } 

    public void run() { 
    while(true){ 
     if(mousePressed == true) 
     yCopter--; 
     if(mousePressed == false && firstClick == true) 
     yCopter++; 

    // repaint(); 

     try { 
     Thread.sleep(10); 
     } 
     catch(InterruptedException ex) { 

     } 
    } 
    } 

    public void mousePressed(MouseEvent e) { 
    mousePressed = true; 
    firstClick = true; 
    } 
    public void mouseReleased(MouseEvent e) { 
    mousePressed = false; 
    } 
} 
+0

'Thread.sleep (10);' Вместо вызова 'Thread.sleep (n)' реализовать таймер Swing' для повторения задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

ответ

0

я мог заметить, вы только настройки Board предпочтительного размера. Если вы хотите установить определенный размер для своего окна, вы можете просто вызвать метод JFrame.setSize() из вас xCopterGame.

Я защищаю вас, чтобы посмотреть на это link. Существуют и другие способы реализации пользовательского интерфейса Swing без необходимости решения этой проблемы при использовании LayoutManager.

+1

Windows имеет границы и другое содержимое, которое «сжимается» в границах фреймов, то есть пространство содержимого тогда меньше ожидаемого. То, что делает OP, на самом деле правильное. Установите предпочтительный размер содержимого и дайте кадру добавить его материал снаружи, поэтому результирующий размер кадра должен быть больше, чем предпочтительный размер содержимого. Я думаю, что Aqua попала в гвоздь на голове – MadProgrammer

+0

Согласен с @MadProgrammer - все идет не так. -1 для первого абзаца, +1 для второго для ссылки на ссылку Java Tutorial. менеджеры макетов. Net 0. –

3

setResizable() может повлиять на вставки рамки. Лучше позвонить pack() после setResizable(). Попробуйте этот порядок вызовов:

setResizable(false); 
pack(); 
setVisible(true); 

Для справки см this анализа по @HovercraftFullOfEels

Вы также можете найти Should I avoid the use of set[Preferred|Maximum|Minimum]Size methods in Java Swing? полезными.

+1

+1 Ницца, я всегда забываю об этом (но опять же, мне не нравятся нежизнеспособные рамки;)) – MadProgrammer

+0

@MadProgrammer да, точно так же здесь :) – tenorsax

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