Java 如何使用GridLayout在网格上添加不同的对象?

Java 如何使用GridLayout在网格上添加不同的对象?,java,object,jpanel,jlabel,Java,Object,Jpanel,Jlabel,所以基本上我想做一个2D迷宫式的游戏,你可以自己创建一张地图或者加载一张预先制作好的地图。单击相应的jb按钮后,您可以通过提供所需新对象的坐标来更改地图的分幅,该对象可以是墙、草、敌人、炸弹、武器、英雄等。我的问题是:到目前为止,我一直在使用jLabel在地图中放置草的图像,因为它们是英雄可以移动的基本瓷砖,然后我尝试将它们更改为不同类别的自定义对象,因此当英雄移动到其中一个时,它会触发不同的动作,但它看起来像一个JLabel只能包含文本或图像,那么我应该怎么做呢?这是密码很抱歉是西班牙语: p

所以基本上我想做一个2D迷宫式的游戏,你可以自己创建一张地图或者加载一张预先制作好的地图。单击相应的jb按钮后,您可以通过提供所需新对象的坐标来更改地图的分幅,该对象可以是墙、草、敌人、炸弹、武器、英雄等。我的问题是:到目前为止,我一直在使用jLabel在地图中放置草的图像,因为它们是英雄可以移动的基本瓷砖,然后我尝试将它们更改为不同类别的自定义对象,因此当英雄移动到其中一个时,它会触发不同的动作,但它看起来像一个JLabel只能包含文本或图像,那么我应该怎么做呢?这是密码很抱歉是西班牙语:

public class Tablero extends JFrame {

private int numFilas;
private int numColumnas;
private int numMuros;

public Tablero(final int numFilas, final int numColumnas, final int numMuros) {
    this.numFilas = numFilas;
    this.numColumnas = numColumnas;
    this.numMuros = numMuros;
    JFrame tablero = new JFrame();
    JPanel contenedor = new JPanel();
    final JLabel[][] casilla = new JLabel[60][60];
    tablero.setSize(1280, 720);
    contenedor.setSize(1280, 720);
    tablero.add(contenedor);

    for (int x = 0; x < this.numFilas; x++) {
        for (int y = 0; y < this.numColumnas; y++) {
            casilla[x][y] = new JLabel();
            casilla[x][y].setIcon(new ImageIcon("C:\\Users\\Andres\\Desktop\\Programación orientada a objetos\\Juego\\build\\classes\\juego\\pasto.png"));
            contenedor.add(casilla[x][y]);
        }
    }
    JOptionPane.showMessageDialog(null, "Cree a continuación el héroe");
    int coorX = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en x del héroe: "));
    int coorY = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en y del héroe: "));
    int lives = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de vidas del héroe: "));
    final Heroe heroe = new Heroe(coorX, coorY, lives);

    JButton añadirMuros = new JButton("Añadir muros");
    contenedor.add(añadirMuros);
    añadirMuros.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            Muro[] muros = new Muro[numMuros];
            for (int i = 0; i < numMuros; i++) {
                int coorX = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en x del muro # " + i + 1));
                int coorY = Integer.parseInt(JOptionPane.showInputDialog("Digite la coordenada en y del muro # " + i + 1));
                muros[i] = new Muro(coorX, coorY, heroe);
                casilla[coorX][coorY] = new JLabel();
            }
            System.out.println("Clicked! muros");
        }
    });

    JButton añadirBombas = new JButton("Añadir bombas");
    contenedor.add(añadirBombas);

    JButton añadirPistolas = new JButton("Añadir pistolas");
    contenedor.add(añadirPistolas);

    JButton añadirBallestas = new JButton("Añadir ballestas");
    contenedor.add(añadirBallestas);

    JButton añadirEnemigos = new JButton("Añadir enemigos");
    contenedor.add(añadirPistolas);

    JButton determinarEntrada = new JButton("Determinar entrada");
    contenedor.add(determinarEntrada);

    JButton determinarSalida = new JButton("Determinar salida");
    contenedor.add(determinarSalida);

    tablero.setVisible(true);
    tablero.setResizable(true);
    tablero.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

}

是的,JLabel只能包含文本或图像图标

您可以使用JPanel直接绘制图像。你的墙和敌人职业可以在一个JPanel上画出他们自己的代表

这是一个游戏图片和猜谜游戏面板。GuessingGamePanel从GameImages类中绘制图像

package com.ggl.guessing.game.view;

import java.awt.Dimension;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class GameImages {

    private Image backgroundImage;
    private Image victoryImage;

    public GameImages() {
        readBackgroundImage();
        readVictoryImage();
    }

    private void readBackgroundImage() {
        Image image = null;
        try {
            URL url = getClass().getResource("/v8k3reduced.jpg");
            image = ImageIO.read(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.backgroundImage = image;
    }

    private void readVictoryImage() {
        Image image = null;
        try {
            URL url = getClass().getResource("/r7f8reduced.jpg");
            image = ImageIO.read(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.victoryImage = image;
    }

    public Image getBackgroundImage() {
        return backgroundImage;
    }

    public Dimension getPreferredSize() {
        return new Dimension(backgroundImage.getWidth(null),
                backgroundImage.getHeight(null));
    }

    public Image getVictoryImage() {
        return victoryImage;
    }

}


谁强迫您使用JLabel?取决于您想做什么。你刚刚告诉我们,JLabel所做的还不够,但你没有告诉我们你真正需要什么。我需要放一个其他类的实例,比如墙或敌人
package com.ggl.guessing.game.view;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

import com.ggl.guessing.game.model.GuessingGameModel;

public class GuessingGamePanel extends JPanel {

    private static final long   serialVersionUID    = 
            -2429103448910749064L;

    private boolean guessed;

    private Dimension guessesPanelDimension;

    private GameImages gameImages;

    private GuessesPanel guessesPanel;

    private GuessingGameFrame frame;

    private GuessingGameModel model;

    public GuessingGamePanel(GuessingGameFrame frame,
            GuessingGameModel model, GameImages gameImages, 
            Dimension guessesPanelDimension) {
        this.frame = frame;
        this.model = model;
        this.gameImages = gameImages;
        this.guessesPanelDimension = guessesPanelDimension;
        this.guessed = false;

        createPartControl();
    }

    private void createPartControl() {
        this.setLayout(null);
        this.setPreferredSize(gameImages.getPreferredSize());

        guessesPanel = new GuessesPanel(frame, model);
        Dimension gp = guessesPanelDimension;
        Dimension tp = gameImages.getPreferredSize();
        int x = (tp.width - gp.width) / 2;
        int y = (tp.height - gp.height) / 2;
        guessesPanel.getPanel().setBounds(x, y, gp.width, gp.height);
        this.add(guessesPanel.getPanel());
    }

    public void setGuessed(boolean guessed) {
        this.guessed = guessed;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(gameImages.getBackgroundImage(), 0, 0, null);
        if (guessed) {
            g.drawImage(gameImages.getVictoryImage(), 0, 0, null);
        }
    }
}