2015-03-09 3 views
1

Я делаю кусок bounc * ing, который перемещается вокруг рамки. Чтобы обнаружить границу кадра, я использовал getHeight() и getWidth() из JComponent в JFrame и вычислил возможную границу, чтобы куб мог отскочить.Почему getHeight() не равен высоте кадра?

Он отлично подходит для getWidth(). Тем не менее, я не могу заставить его отскочить на границе для getHeight().

Когда cu * будет уходить в верхнюю часть окна, он продолжает двигаться примерно на 10 пикселей до отскока.

Вот скриншот этой проблемы.

enter image description here

Вот мой код:

public class Cube { 
    final public static int DIMENSION = 100; 
    private final static int D_X = 20; 
    private final static int D_Y = -20; 
    private final static int SPEED = 1; 
    private int xVelBK; 
    private int yVelBK; 
    private int xVel; 
    private int yVel; 
    private CubePoint[] pts; 

    public Cube(int x, int y){ 
    xVel = SPEED; 
    yVel = SPEED; 

    pts = new CubePoint[8]; 

    pts[0] = new CubePoint(x,y); 
    pts[1] = new CubePoint(x,y - DIMENSION); 
    pts[2] = new CubePoint(x + DIMENSION,y - DIMENSION); 
    pts[3] = new CubePoint(x + DIMENSION,y); 

    pts[4] = new CubePoint(x + D_X,y + D_Y); 
    pts[5] = new CubePoint(x + D_X,y + D_Y - DIMENSION); 
    pts[6] = new CubePoint(x + D_X + DIMENSION,y + D_Y - DIMENSION); 
    pts[7] = new CubePoint(x + D_X + DIMENSION,y + D_Y); 
    } 

    public void move(int componentWidth, int componentHeight){ 
    ...... 

    //bug in here 
    if (pts[0].getY() - DIMENSION - D_Y <= 0) { 
     yVel = SPEED; 
    } 

    ....... 
    } 
.......... 
} 

Вот компонент:

public class CubeComponent extends JComponent { 
    ........... 

    private Cube cube; 
    private Timer timer; 
    private CubePoint originMousePos; 
    private CubePoint closest; 
    private Font font; 
    private int mode; 


    private int delay = DEFAULT_DELAY ; 

    private int mouseToClosestX; 
    private int mouseToClosestY; 

    class CubeMoveListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     cube.move(getWidth(),getHeight()); 
     repaint(); 
    } 

    } 



    @Override 
    public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D)g; 

    cube.draw(g2); 
    } 

} 
+0

Название окна включено в размер окна. Есть функция, которая сообщает вам размер «внутренней части» окна, но я не помню, как это называется прямо сейчас. (Кто-то еще может) – immibis

+0

'public void paintComponent (Графика g) {..' должна быть' public void paintComponent (Graphics g) {super.paintComponent (g); ..' (в пятый раз сегодня). –

+0

Возможный дубликат [JFrame: получение фактического размера содержимого] (http://stackoverflow.com/questions/7154633/jframe-getting-actual-content-size) – fdsa

ответ

4

Насколько я могу сказать:

if (pts[0].getY() - DIMENSION - D_Y <= 0) { 

следует использовать определить когда куб достигает нижней части компонента, так что вы должны быть тестирование на «>»

и

if (pts[0].getY() >= componentHeight) { 

следует использовать для тестирования, когда куб достигает вершины. Так оно и должно быть:

if (pts[0].getY() <= 0) { 

Ключевым моментом является то, что:

  1. ОДИН из вертикальных испытаний необходимо проверить "< = 0".
  2. Структура горизонтального и вертикального теста должна быть одинаковой, вам просто нужно изменить имена переменных.