Я пытаюсь создать фрейм JDialog, который будет иметь фоновое изображение и интерактивную JPanel над ним. В этом контексте JDialog будет представлять собой «боевое» поле, где можно будет выбирать и перемещать юниты. Игра основана на космосе, поэтому будет ArrayList кораблей и, возможно, планета для защиты.
Я смог переопределить paintComponent, чтобы нарисовать грубый круг, представляющий «планету», но не смог показать фоновое изображение JLabel. Затем я мог заставить фон JLabel показывать, но не мог видеть круги. В идеале я хочу заменить круги реальными изображениями для каждого типа корабля и уникальными для планет. Я открыт для других методов, кроме использования JDialog/JLayered/Customer JPanel, если есть лучший способ сделать это. Я работаю над этим больше часов, чем могу сосчитать.
Я создал JDialog, добавил JLayeredPane и установил в нем JLabel для фона. Я написал собственный класс, расширяющий JPanel, который будет добавлен в JLayeredPane над JLabel, который рисует круги для планеты и юнитов.
Причина, по которой я выбрал JPanel, заключается в том, что я могу проверять события мыши, чтобы определить, что выбирает игрок (планету для добавления ресурсов) или корабль (для движения и атаки).
для пользовательской JPanel я написал это простое расширение:
public class SectorPnl extends javax.swing.JPanel implements MouseInputListener, ActionListener {
private int circleY, circleX, circleRadius;
private Sector sector;
private Shape planetShape;
private Shape shipShape;
private Ship ship;
private Planet planet;
private Invasion inv;
private ArrayList<ShipType> shipBuild;
public SectorPnl(Sector sector, Invasion inv)
{
initComponents();
this.sector = sector;
this.inv = inv;
this.planet = sector.getPlanet();
shipBuild = new ArrayList();
Timer update = new Timer(28, this);
update.start();
if ( sector.hasPlanet() )
{
circleRadius = (int) sector.getPlanet().getPlanetRadius();
circleX = (int) sector.getPlanet().getPositionX();
circleY = (int) sector.getPlanet().getPositionY();
planetShape = new Ellipse2D.Double(circleX, circleY, circleRadius,
circleRadius);
}
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponents(g);
Graphics2D g2 = (Graphics2D) g;
if ( planetShape != null)
{
g2.setColor(Color.red);
g2.fill(planetShape);
g2.draw(planetShape);
}
if ( shipShape != null )
{
g2.setColor(Color.white);
g2.fill(shipShape);
g2.draw(shipShape);
}
}
А это строки для добавления его в JDialog:
sectorDlg.setTitle(sector.getName());
sectorDlg.setVisible(true);
sectorDlg.setSize(800,800);
SectorPnl sectorPnl = new SectorPnl(sector, inv);
sectorPnl.addMouseListener(sectorPnl);
sectorPnl.addMouseMotionListener(sectorPnl);
sectorLayer.setLayer(sectorPnl, 100);
sectorLayer.setBounds(0, 0, 800, 800);