Я реализовал шахматную игру с помощью Java Swing, и столкнулся с проблемой: даже после программного удаления шахматной фигуры с доски ее визуальное представление остается на экране. Я проверил, что структура данных, содержащая фрагменты, обновлена правильно, но визуальное представление не отражает это изменение. Как я могу гарантировать, что визуальное представление шахматной фигуры будет удалено с экрана при его программном удалении?
package com.wallhack.chess;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.JLabel;
public class Board extends JPanel {
private final PieceFactory pieceFactory = new PieceFactory();
public ConcurrentHashMap pieceBox = new ConcurrentHashMap();
public HashMap pieceLabels = new HashMap();
private final int cellSize = 80;
private final int initialX = 63;
private final int initialY = 60;
private final BoardRender boardRender;
private final BoardLayoutManager boardLayoutManager;
private Point highlightCell;
public Board(BoardLayoutManager boardLayoutManager) {
this.boardLayoutManager = boardLayoutManager;
setLayout(new BoardLayoutManager());
boardRender = new BoardRender(initialX, initialY, cellSize);
pieceByDefault();
for (String piece : pieceBox.keySet()) {
createAndPositionLabel(piece);
}
for (String piece : pieceLabels.keySet()) {
JLabel label = pieceLabels.get(piece);
ChessPiece chessPiece = pieceBox.get(piece);
if (label != null && chessPiece != null) {
Point pieceCoordinates = new Point(chessPiece.getCoordinates().x, chessPiece.getCoordinates().y);
add(label , pieceCoordinates);
}
}
MouseHandler mouseHandler = new MouseHandler(this, new PieceMoves(this));
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
}
public static K getKeyFromValue(Map map, V value) {
for (Map.Entry entry : map.entrySet()) {
if (Objects.equals(value, entry.getValue())) {
return entry.getKey();
}
}
return null;
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
boardRender.drawBoard(g2);
boardRender.drawLabel(g2);
if (highlightCell != null) {
Point cell = gridToPoint(highlightCell);
Rectangle bounds = new Rectangle(cell.x, cell.y, cellSize,cellSize);
g2.setColor(Color.RED);
g2.draw(bounds);
}
}
private void createAndPositionLabel(String piece) {
JLabel label = new JLabel();
try {
String imagePath = "com/wallhack/chess/resources/" + pieceBox.get(piece).getIndex();
label.setIcon(new ImageIcon(ImageIO.read(Objects.requireNonNull(getClass().getClassLoader().getResource(imagePath)))));
} catch (IOException e) {
e.printStackTrace();
System.out.println("Eroare la citirea imaginii!");
}
Point offset = getBoardOffset();
Point pieceCoordinates = gridToPoint(pieceBox.get(piece).getCoordinates());
label.setBounds(pieceCoordinates.x + offset.x, pieceCoordinates.y + offset.y, cellSize, cellSize);
pieceLabels.put(piece, label);
}
private void pieceByDefault () {
String[][] defaultPositions = {
{"Br1", "Bn1", "Bb1", "Bq", "Bk", "Bb2", "Bn2", "Br2"},
{"Bp1", "Bp2", "Bp3", "Bp4", "Bp5", "Bp6", "Bp7", "Bp8"},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{"LP1", "LP2", "LP3", "LP4", "LP5", "LP6", "LP7", "LP8"},
{"LR1", "LN1", "LB1", "LQ", "LK", "LB2", "LN2", "LR2"}
};
for (int i = 0; i < defaultPositions.length; i++) {
for (int j = 0; j < defaultPositions.length; j++) {
String pieceType = defaultPositions[i][j];
if (!pieceType.equals(" ")) {
pieceBox.put(pieceType, pieceFactory.create(pieceType.charAt(1), new Point(j, i)));
}
}
}
}
public Point pointToGrid(Point p) {
Point point = null;
if (p != null) {
var pointX = (p.x - initialX) / cellSize;
var pointY = (p.y - initialY) / cellSize;
if (0 isValidRookMove(coord, initial);
case Queen -> isValidQueenMove(coord, initial);
case King -> isValidKingMove(coord, initial);
};
}
}
Я попытался удалить JLabel, связанный с удаленной шахматной фигурой, из JPanel с помощью метода удаления, но визуальное представление фигуры все равно осталось на экране. Я ожидал, что при удалении JLabel визуальное представление шахматной фигуры также будет удалено с экрана.
Я реализовал шахматную игру с помощью Java Swing, и столкнулся с проблемой: даже после программного удаления шахматной фигуры с доски ее визуальное представление остается на экране. Я проверил, что структура данных, содержащая фрагменты, обновлена правильно, но визуальное представление не отражает это изменение. Как я могу гарантировать, что визуальное представление шахматной фигуры будет удалено с экрана при его программном удалении? [code]public static K getKeyFromValue(Map map, V value) { for (Map.Entry entry : map.entrySet()) { if (Objects.equals(value, entry.getValue())) { return entry.getKey(); } } return null; }
public class Board extends JPanel { private final PieceFactory pieceFactory = new PieceFactory(); public ConcurrentHashMap pieceBox = new ConcurrentHashMap(); public HashMap pieceLabels = new HashMap(); private final int cellSize = 80; private final int initialX = 63; private final int initialY = 60; private final BoardRender boardRender; private final BoardLayoutManager boardLayoutManager; private Point highlightCell;
public Board(BoardLayoutManager boardLayoutManager) { this.boardLayoutManager = boardLayoutManager; setLayout(new BoardLayoutManager());
boardRender = new BoardRender(initialX, initialY, cellSize);
pieceByDefault();
for (String piece : pieceBox.keySet()) { createAndPositionLabel(piece); }
for (String piece : pieceLabels.keySet()) { JLabel label = pieceLabels.get(piece); ChessPiece chessPiece = pieceBox.get(piece); if (label != null && chessPiece != null) { Point pieceCoordinates = new Point(chessPiece.getCoordinates().x, chessPiece.getCoordinates().y); add(label , pieceCoordinates); } }
MouseHandler mouseHandler = new MouseHandler(this, new PieceMoves(this)); addMouseListener(mouseHandler); addMouseMotionListener(mouseHandler);
} public static K getKeyFromValue(Map map, V value) { for (Map.Entry entry : map.entrySet()) { if (Objects.equals(value, entry.getValue())) { return entry.getKey(); } } return null; } @Override protected void paintComponent(Graphics g){ super.paintComponent(g);
public Point pointToGrid(Point p) { Point point = null; if (p != null) { var pointX = (p.x - initialX) / cellSize; var pointY = (p.y - initialY) / cellSize; if (0 isValidRookMove(coord, initial); case Queen -> isValidQueenMove(coord, initial); case King -> isValidKingMove(coord, initial); }; } } [/code] Я попытался удалить JLabel, связанный с удаленной шахматной фигурой, из JPanel с помощью метода удаления, но визуальное представление фигуры все равно осталось на экране. Я ожидал, что при удалении JLabel визуальное представление шахматной фигуры также будет удалено с экрана.
В настоящее время я работаю над Java-проектом, реализуя правила игры в шахматы в существующем скелетном коде, который предоставляет мне шахматную игровую доску и основную функцию. Как вы можете видеть в моем следующем коде, он состоит из двух...
Поэтому моя шахматная сетка немного отличается от других. Строки начинаются снизу вверх, то есть от 1 до 8 снизу. и столбцы от A до H, в основном сетка 8 на 8. Теперь, перейдя прямо к делу: я не уверен, как бы я мог создать алгоритм, который...
Поэтому моя шахматная сетка немного отличается от других. Строки начинаются снизу вверх, то есть от 1 до 8 снизу. и столбцы от A до H, в основном сетка 8 на 8. Теперь, перейдя прямо к делу: я не уверен, как бы я мог создать алгоритм, который...
I want to make the pair group function when I click on the first image, then click on the second image, they will be connected by a black line, the line starts from the right edge of the first image and the left edge of The second image is as sample...
Как изменить размер изображения, чтобы оно подходило для печати?
Например, я хотел бы использовать бумагу формата A4, размеры которого составляют 11,7 x 8,27 дюйма. в альбомной ориентации.