Вы можете сделать sh эквивалент сетки самостоятельно, только рисуя с y-координатой, кратной 40. Я предлагаю 40, так как вы устанавливаете высоту своего окна на 400, и вы хотите иметь 10 “ полы »в вашей сетке и 400 ÷ 10 = 40.
Таким образом, последняя строка в вашем методе paintComponent должна выглядеть следующим образом:
g.fillRect(x, y * 40, 50, 30);
Технически область рисования окна будет немного меньше 400, так как размер JFrame включает строку заголовка и границы окна. Это можно исправить, заменив это:
jf.setSize(600, 400);
на это:
jf.add(t);
jf.pack();
и удалив другую строку jf.add(t);
. Вам также необходимо добавить переопределение getPreferredSize
в вашем классе:
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
(Вам также понадобится строка import java.awt.Dimension;
в верхней части вашей программы.)
pack()
метод говорит окну делать все возможное, чтобы соответствовать предпочтительному размеру каждого компонента, который он содержит. Вот почему необходимо, чтобы ваша панель сообщала о своем предпочтительном размере, и поэтому необходимо добавить панель до того, как JFrame будет упакован и станет видимым.
Относительно того, почему прямоугольник так быстро удаляется с экрана, это происходит из-за числа, которое вы передаете своему таймеру:
Timer tm = new Timer(5, this);
То, что 5
означает, что метод actionPerformed вызывается Swing каждые 5 миллисекунд - это 200 раз в секунду! Возможно, вам нужно более разумное значение, например, два раза в секунду:
Timer tm = new Timer(500, this);
Наконец, вам нужно убедиться, что ваш прямоугольник никогда не покидает экран, проверив минимальное и максимальное значения y
в ваш actionPerformed метод:
y = y + velY;
y = Math.max(0, y); // don’t let y go off the top
y = Math.min(9, y); // don’t let y go off the bottom