Hallo zusammen,
ich versuche gerade, eine Schach-Engine mit Java zu erstellen, und hadere gerade mit dem MouseListener. Dies ist erstmal der relevante Code des BoardPanels:
Leider weiß ich nicht so recht, wie ich einen passenden MouseListener erstelle, mit welchem ich eine Figur ganz normal ziehen kann. Im Moment klappt das nur über die Konsole. Ich habe da gar keine Idee, da ich sonst nur mit Drop-Areas gearbeitet habe. Vielleicht könnt ihr mir ja mal einen anstupser geben. Nehme auch gerne zusätzliche Code Verbesserungsvorschläge an.
ich versuche gerade, eine Schach-Engine mit Java zu erstellen, und hadere gerade mit dem MouseListener. Dies ist erstmal der relevante Code des BoardPanels:
Java:
package com.chess.gui;
import com.chess.engine.board.ChessBoard;
import com.github.bhlangonijr.chesslib.Piece;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import javax.imageio.ImageIO;
public class BoardPanel extends JPanel {
private final ChessBoard chessBoard;
private final Map<String, Image> pieceImages = new HashMap<>();
private static final String[] ROW_LABELS = {"8", "7", "6", "5", "4", "3", "2", "1"};
private static final String[] COLUMN_LABELS = {"A", "B", "C", "D", "E", "F", "G", "H"};
private Piece selectedPiece;
public BoardPanel(final ChessBoard chessBoard) {
this.chessBoard = chessBoard;
initialize();
}
private void initialize() {
this.setLayout(new GridLayout(10, 10));
this.setPreferredSize(new Dimension(500, 500));
loadPieceImages();
setupBoard(new Color(255, 206, 158), new Color(209, 139, 71));
setupPieces();
}
private void setupBoard(Color color1, Color color2) {
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
JPanel square = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.CENTER;
if (row == 0 || row == 9) {
if (col > 0 && col < 9) {
square.add(new JLabel(COLUMN_LABELS[col - 1], SwingConstants.CENTER), gbc);
}
} else if (col == 0 || col == 9) {
if (row > 0 && row < 9) {
square.add(new JLabel(ROW_LABELS[row - 1], SwingConstants.CENTER), gbc);
}
} else {
int boardRow = row - 1;
int boardCol = col - 1;
if ((boardRow + boardCol) % 2 == 0) {
square.setBackground(color1);
} else {
square.setBackground(color2);
}
}
this.add(square);
}
}
}
private void setupPieces() {
String boardVisual = chessBoard.getBoardVisual();
String[] rows = boardVisual.split("\n");
for (int row = 1; row <= 8; row++) {
for (int col = 1; col <= 8; col++) {
char pieceChar = rows[row - 1].charAt(col - 1);
if (pieceChar != '.') {
String pieceName = String.valueOf(pieceChar);
JLabel pieceLabel = new JLabel(new ImageIcon(pieceImages.get(pieceName)));
int componentIndex = row * 10 + col;
JPanel square = (JPanel) this.getComponent(componentIndex);
square.add(pieceLabel, new GridBagConstraints());
}
}
}
}
public void refreshBoard() {
this.removeAll();
setupBoard(new Color(255, 206, 158), new Color(209, 139, 71));
setupPieces();
this.revalidate();
this.repaint();
}
}