один из способов сделать это - перерисовывать каждую строку при каждом нажатии клавиши, но это кажется чрезмерным.
Именно так и работает живопись. Swing имеет двойную буферизацию, поэтому вы не заметите проблем с покраской.
Однако это не ваша текущая проблема.
Я не могу понять, как сохранить сетку на экране, в то время как прямоугольник перемещается
Диспетчером компоновки по умолчанию для панели содержимого JFrame является BorderLayout. Когда вы добавляете компонент в BorderLayout и не указываете ограничение, предполагается BorderLayout.CENTER.
add(gridToWorkWith);
add(recToWorkWith);
Итак, с помощью приведенного выше кода вы пытаетесь добавить два компонента в BorderLayout.CENTER
. Однако BorderLayout управляет только последним добавленным компонентом, то есть первый компонент будет иметь размер (0, 0), поэтому он никогда не окрашивается. 1017 1019 *
Таким образом, код может быть примерно таким:
gridToWorkWith.setLayout( new BorderLayout() );
gridToWorkWith.add( recToWorkWith );
add(gridToWorkWith);
//add(recToWorkWith);
Однако это все равно не сработает, потому что по умолчанию JPanel непрозрачен, поэтому вы не увидите сетку, потому что прямоугольник рисует поверх из этого. Итак, вам нужно сделать прямоугольник непрозрачным:
recToWorkWith.setOpaque( false );
Приятно видеть, что вы используете привязки клавиш. Одно из предложений - создать действие с параметром для управления движением прямоугольника. Таким образом, двумя параметрами будет изменение местоположения по оси x / y.
В качестве примера такого подхода посмотрите MotionAction
, найденный в примере MotionWithKeyBindings
, найденном в Motion Using the Keyboard . Ваши четыре действия можно легко заменить на 4 экземпляра одного и того же действия, используя разные параметры. Вы даже можете создать движение по диагонали.