Перемещение и изменение размера объекта JPanels внутри JFrame - PullRequest
1 голос
/ 13 апреля 2010

Продолжая свои поиски изучения Java с помощью простой игры, я наткнулся на небольшую проблему.Моя игровая доска расширяет JPanel, а также каждый кусок доски.Теперь это создает некоторые проблемы:

  1. Не удается задать размер набора для каждого фрагмента, поэтому каждый фрагмент JPanel занимает весь JFrame, скрывая остальные фрагменты и фон (игровую доску).

  2. Не могу установить положение штук.

У меня есть менеджер потока по умолчанию.Попробовал setbounds и не повезло.

Может быть, я должен сделать кусок, чтобы расширить другой JComponent?Добавленное изображение: это кусок, теперь область с серым цветом тоже часть!Проверил это, сделав слушателя mousePressed и присвоив ему некоторые вещи.Ниже серой области находится игровая доска (или, по крайней мере, должна быть!) Другая JPanel.

альтернативный текст http://img42.imageshack.us/img42/2227/screenshotvdy.png

Какой-то код:

package TheProject;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameWindow extends JFrame {
public GameWindow() {
    setSize(800, 600);
    setLocationRelativeTo(null);
    Map map = new Map(800, 600, 2);
    add(map);

    MilitaryUnit imperialRussia = new MilitaryUnit(30, Color.BLACK, Color.YELLOW, Color.WHITE);
    imperialRussia.setPreferredSize(new Dimension(30, 30));
    add(imperialRussia);

}
 }

Это происходит, когда я применяю метод pack (): альтернативный текст http://img442.imageshack.us/img442/5813/screenshot2ml.png

Пачки вокруг Юнита, а не карта, которая больше и заполняет JFrame.

Ответы [ 4 ]

1 голос
/ 13 апреля 2010

Для игры со случайным перемещением фигур вы, вероятно, использовали бы «нулевую раскладку».

Прочтите раздел из учебника по Swing на Абсолютное позиционирование для получения дополнительной информации.

0 голосов
/ 13 апреля 2010

Я написал несколько игр, используя JPanel. Обычно я использую JPanel, как будто я использую Canvas, то есть я рисую прямо на нем, переопределяя метод paint(). Причина, по которой я использую JPanel, заключается в том, что я могу определить размер игрового мира, а затем использовать setPreferredSize(), чтобы установить размер панели. Затем я добавляю панель к JScrollPane. Так что это позаботится о панорамировании и т. Д.

Скажем, я пишу 2D-игру. Вот как я использую JPanel. У меня есть логическая карта (2D-массив), которая содержит мою игровую карту. Скажем, каждое местоположение 32x32 пикселей. Итак, вы начинаете рисовать землю и то, что находится на этой земле в этом месте. например, при x = 1, y = 2, который является местоположением экрана x = 32, y = 64, сначала вы рисуете землю, а затем рисуете то, что на земле. Таким образом, грубый контур цикла рендеринга будет выглядеть примерно так:

for (int y = 0; y < map.length; y++)
   for (int x = 0; x < map[y].length; x++) {
      drawGround(map[y][x])
      for very element on on map[y][x] - render them
}      

Вы устанавливаете MouseListener слушателя для JPanel, поэтому каждый щелчок мышью вы переводите обратно на карту, например. щелчок мыши x = 54, y = 72 будет соответствовать x = 1, y = 2. Вычисление немного сложнее, если у вас есть изометрическая проекция.

Здесь вы должны быть осторожны, так как каждый раз, когда вы прокручиваете панель через панель прокрутки, вызывается paint(). Так что хорошо сделать вашу игровую доску на BufferedImage, а затем в методе paint() просто нарисуйте BufferedImage, иначе это будет слишком медленно.

0 голосов
/ 13 апреля 2010

Вы пробовали визуальный редактор NetBeans? Вы можете использовать его для перетаскивания, изменения размера и изменения размера для вашего удобства Swing-объектов в режиме конструктора, а затем можете переключиться в режим просмотра кода, чтобы увидеть сгенерированный код. Вы можете научиться так.

0 голосов
/ 13 апреля 2010

Вы пробовали setPreferredSize(Dimension d)?

Редактировать: Вам нужно позвонить pack() на свой JFrame после того, как вы добавили свои компоненты:

JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(800,600));
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200,200));
frame.add(panel);
frame.pack();
frame.setvisible(true);

Также вы добавляетеКарта для вашего JFrame, которая имеет те же размеры, что и ваш JFrame - отлично.Но затем вы добавляете еще один компонент в стандартную разметку потока.Это не может вписаться в ваш кадр, так как карта уже занимает 100% пространства.

...