MouseListener Schach

HerrInfo

Aktives Mitglied
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:
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();
    }
}
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.
 

Robert Zenz

Top Contributor
Also ich behaupte du willst ueberhaupt kein Layout, sondern die Elemente alle haendisch platzieren. Dann kannst du naemlich mit einem MouseListener/MouseMotionListener auf deinem JPanel lauschen und die Elemente entsprechend haendisch verschieben. Das hat den Vorteil dass du die Spielsteine waehrend des verschiebns sehr einfach "zwischen" Feldern zeichnen kannst, weil du sie halt einfach dort positionierst. So in etwa:

Java:
public class Chessboard extends JContainer {
    public Chessboard() {
        super();
       
        setLayout(null);
       
        for each tile in this chessboard {
            add(tile);
            tile.setDimension(
                calculateCorrectX,
                calculateCorrecty,
                getWidth() / 8,
                getHeight() / 8);
        }
    }
}

Und das gleiche fuer die `JComponent`s welche die Spielfiguren ausmachen. Dann kannst du naemlich auf diesem JContainer einen Listener fuer die Maus einhaengen, die Koordinaten von dieser Komponente holen und diese dann verschieben.

Alternativ koenntest du auch eine GlassPane verwenden. Dafuer habe ich sogar schon ein Beispiel wo man Komponenten verschieben kann.
 

HerrInfo

Aktives Mitglied
Ok, das ist eine gute Idee mit dem Absoluten Layout. Daran habe ich gar nicht gedacht. Aber ist es mit dem GridLayout denn gar nicht umsetzbar?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R Punkt von MouseListener hat falsche Koordinate AWT, Swing, JavaFX & SWT 2
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
U MouselIstener zu JFrame AWT, Swing, JavaFX & SWT 6
F Swing MouseListener im JPanel AWT, Swing, JavaFX & SWT 3
J Swing Button mit JTable und MouseListener AWT, Swing, JavaFX & SWT 8
F JPanel + MouseListener AWT, Swing, JavaFX & SWT 5
JavaInBrain Swing Rückgabe aus MouseListener-Klasse AWT, Swing, JavaFX & SWT 3
A SWT SWT Scale und MouseListener AWT, Swing, JavaFX & SWT 7
J MouseListener und rechte Maustaste AWT, Swing, JavaFX & SWT 3
R MouseListener auf JPanel AWT, Swing, JavaFX & SWT 3
Q Swing MouseListener auf JTable geht nicht AWT, Swing, JavaFX & SWT 2
J Swing Einbau MouseListener in JPanel AWT, Swing, JavaFX & SWT 3
N Mit MouseListener X-Y Angaben vom Bild erfahren AWT, Swing, JavaFX & SWT 3
T MouseListener an Ecken von Polygonen hinzufügen AWT, Swing, JavaFX & SWT 5
H Swing JPanel in JTable mit MouseListener AWT, Swing, JavaFX & SWT 3
A Individueller MouseListener ? AWT, Swing, JavaFX & SWT 7
B MouseListener im Renderer einer JComboBox AWT, Swing, JavaFX & SWT 3
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
M MouseListener/MouseMotionListener AWT, Swing, JavaFX & SWT 2
njans SWT MouseListener exited AWT, Swing, JavaFX & SWT 4
danx066 MouseListener macht was er will AWT, Swing, JavaFX & SWT 14
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
U Swing Generierung mehrerer Kreise per MouseListener AWT, Swing, JavaFX & SWT 16
Semox Swing JApplet: Problem MouseListener Anmeldung AWT, Swing, JavaFX & SWT 3
C JTappedPane Mouselistener auf Überschrift Registerkarte AWT, Swing, JavaFX & SWT 2
M MouseListener AWT, Swing, JavaFX & SWT 3
K AWT MouseListener linke und rechte Maustaste AWT, Swing, JavaFX & SWT 5
C Swing MouseListener Doppelklick-Geschwindigkeit AWT, Swing, JavaFX & SWT 4
N Swing MouseListener in JTable AWT, Swing, JavaFX & SWT 4
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
R MouseListener wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
P JComboBox und MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
raptorrs Swing MouseListener reagiert nicht auf Instanz einer JTable AWT, Swing, JavaFX & SWT 6
multiholle Swing Mouselistener auf Parentpanel immer aktiv AWT, Swing, JavaFX & SWT 7
C MouseListener und ActionListener kombinieren AWT, Swing, JavaFX & SWT 17
M Komponenten einer unbestimmten Anzahl und MouseListener AWT, Swing, JavaFX & SWT 4
A MouseListener funktionert nie AWT, Swing, JavaFX & SWT 12
C Probleme mit Größe und mit MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener für jede Zelle einer JTable AWT, Swing, JavaFX & SWT 4
E MouseListener Problem AWT, Swing, JavaFX & SWT 4
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
S MouseListener zurückverfolgung auf element. AWT, Swing, JavaFX & SWT 7
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
M JCheckBox Standard MouseListener entfernen AWT, Swing, JavaFX & SWT 13
hdi Wie mach ich diesen MouseListener AWT, Swing, JavaFX & SWT 4
G MouseListener & KeyListener AWT, Swing, JavaFX & SWT 4
H JComboBox reagiert nicht auf MouseListener AWT, Swing, JavaFX & SWT 5
2 Mouselistener AWT, Swing, JavaFX & SWT 2
W MouseListener, getClickCount und Doppelklick AWT, Swing, JavaFX & SWT 6
S swing komponenten mit mouselistener rotieren AWT, Swing, JavaFX & SWT 15
G JFrame,JLabel,MouseListener AWT, Swing, JavaFX & SWT 6
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
V Frage zu MouseListener --> mousePressed() AWT, Swing, JavaFX & SWT 5
C MouseListener für Spalte eines JTables AWT, Swing, JavaFX & SWT 4
K Problem mit 2 MouseListener. AWT, Swing, JavaFX & SWT 3
M MouseMotionListener oder mouseListener AWT, Swing, JavaFX & SWT 6
T JComboBox und MouseListener AWT, Swing, JavaFX & SWT 11
F MouseListener - Unhandled IOException AWT, Swing, JavaFX & SWT 5
padde479 Statusleiste mit MouseListener aktualisieren AWT, Swing, JavaFX & SWT 3
L Problem mit MouseListener, AdjustmentListener AWT, Swing, JavaFX & SWT 6
T MouseListener Problem AWT, Swing, JavaFX & SWT 3
F Mouselistener wird wiederholt aufgerufen AWT, Swing, JavaFX & SWT 3
G Frage zu MouseListener und speichern des Wertes (reflektion? AWT, Swing, JavaFX & SWT 6
B frage zu MouseListener AWT, Swing, JavaFX & SWT 5
O MouseListener - Wert-Übergabe AWT, Swing, JavaFX & SWT 3
W JPanel, JLabel und MouseListener -> auf clicks reagieren AWT, Swing, JavaFX & SWT 5
S MouseListener auf einem einzelnen Tab setzen AWT, Swing, JavaFX & SWT 3
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
G MouseListener AWT, Swing, JavaFX & SWT 4
G Tooltip sperrt MouseListener? AWT, Swing, JavaFX & SWT 6
S JComboBox und MouseListener AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
A Klassenübergreifend MouseListener verwenden AWT, Swing, JavaFX & SWT 14
N "globaler" MouseListener (+MouseMotionListener) AWT, Swing, JavaFX & SWT 4
M ToolTipText für JTable mit MouseListener ohne anklicken? AWT, Swing, JavaFX & SWT 7
A MouseListener auf Bild legen ? AWT, Swing, JavaFX & SWT 16
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
J MouseListener AWT, Swing, JavaFX & SWT 3
A JPanels in JPanel und MouseListener AWT, Swing, JavaFX & SWT 3
C Mehrere MouseListener? AWT, Swing, JavaFX & SWT 7
U Keylistener und Mouselistener AWT, Swing, JavaFX & SWT 2
L Event-handling, MouseListener AWT, Swing, JavaFX & SWT 5
T Problem mit MouseListener bei JButton AWT, Swing, JavaFX & SWT 5
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
G Problem mit MouseListener AWT, Swing, JavaFX & SWT 9
G Swing JLayeredPane Schach AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben