Added methods to PgnGui class

SavePgn
Justin 2025-06-23 02:40:30 +02:00
parent f80fb99ba1
commit 6273261fd0
1 changed files with 269 additions and 1 deletions

View File

@ -1,5 +1,273 @@
package de.hs_mannheim.informatik.chess.view;
public class PgnGui {
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import de.hs_mannheim.informatik.chess.model.BoardDTO;
import de.hs_mannheim.informatik.chess.model.PieceDTO;
public class PgnGui {
private JLabel[][] fields = new JLabel[8][8];
private JButton flipBoardButton;
private boolean isFlipped = false;
JButton btnFirst = new JButton("|<");
JButton btnPrev = new JButton("<");
JButton btnNext = new JButton(">");
JButton btnLast = new JButton(">|");
Color LIGHT = new Color(0xe0e1dd);
Color DARK = new Color(0x778da9);
private JPanel moveListPanel;
private JScrollPane moveListScroll;
public PgnGui(){
initFields();
mainFrame();
}
public JFrame mainFrame() {
JFrame frame = new JFrame();
frame.setSize(1600, 1000);
frame.setLocationRelativeTo(null);
frame.add(mainPanel());
frame.setDefaultCloseOperation(2);
frame.setVisible(true);
return frame;
}
private void initFields() {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
JLabel label = new JLabel("", SwingConstants.CENTER);
label.setOpaque(true);
label.setFont(new Font("Serif", Font.BOLD, 40));
// Richtige Schachfärbung:
if ((row + col) % 2 == 0) {
label.setBackground(LIGHT); // a1 ist jetzt hell!
} else {
label.setBackground(DARK);
}
fields[row][col] = label;
}
}
}
public JPanel mainPanel() {
JPanel mainPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
mainPanel.setBackground(new Color(0xe0e1dd));
// Links (Schach)
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.6;
gbc.weighty = 1.0;
gbc.insets = new Insets(5, 5, 5, 0);
//oben, links, unten, rechts
gbc.fill = GridBagConstraints.BOTH;
mainPanel.add(chessPanel(boardPanel()), gbc);
// Rechts (Stats)
gbc.gridx = 1;
gbc.gridy = 0;
gbc.weightx = 0.4;
gbc.weighty = 1.0;
gbc.insets = new Insets(5, 0, 5, 5);
//oben, links, unten, rechts
gbc.fill = GridBagConstraints.BOTH;
mainPanel.add(statsPanel(), gbc);
return mainPanel;
}
public JPanel boardPanel() {
JPanel boardPanel = new JPanel(new GridLayout(8, 8));
boardPanel.setPreferredSize(new Dimension(800, 800));
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
JLabel label = new JLabel("", SwingConstants.CENTER);
label.setOpaque(true);
label.setFont(new Font("Serif", Font.BOLD, 70));
// Richtige Schachfärbung:
if ((row + col) % 2 == 0) {
label.setBackground(LIGHT);
} else {
label.setBackground(DARK);
}
fields[row][col] = label;
boardPanel.add(label);
}
}
boardPanel.setBackground(new Color(0x1b263b));
return boardPanel;
}
public JPanel chessPanel(JPanel panel) {
JPanel chessPanel = new JPanel(new GridBagLayout());
GridBagConstraints board = new GridBagConstraints();
chessPanel.setBackground(new Color(0x1b263b));
board.gridx = 0;
board.gridy = 0;
board.weightx = 0.7;
board.weighty = 1.0;
board.insets = new Insets(0, 0, 0, 0);
//oben, links, unten, rechts
board.fill = GridBagConstraints.BOTH;
chessPanel.add(panel);
// Button unten rechts
flipBoardButton = new JButton("⇵");
flipBoardButton.setPreferredSize(new Dimension(70, 70));
flipBoardButton.setFont(new Font("SansSerif", Font.BOLD, 40));
flipBoardButton.setBackground(new Color(0x5500ff));
flipBoardButton.setForeground(Color.WHITE);
flipBoardButton.setFocusPainted(false);
GridBagConstraints btn = new GridBagConstraints();
btn.gridx = 0;
btn.gridy = 1;
btn.weightx = 0.0;
btn.weighty = 0.0;
btn.anchor = GridBagConstraints.SOUTHEAST;
btn.insets = new Insets(10, 0, 0, 0);
chessPanel.add(flipBoardButton, btn);
return chessPanel;
}
public JPanel statsPanel() {
JPanel statsPanel = new JPanel(new BorderLayout());
statsPanel.setBackground(new Color(0x0d1b2a));
// Move-Liste
moveListPanel = new JPanel();
moveListPanel.setLayout(new BoxLayout(moveListPanel, BoxLayout.Y_AXIS));
moveListPanel.setBackground(new Color(0x0d1b2a));
moveListScroll = new JScrollPane(moveListPanel);
moveListScroll.setPreferredSize(new Dimension(250, 800));
statsPanel.add(moveListScroll, BorderLayout.CENTER);
// Button-Leiste
JPanel buttonPanel = new JPanel();
buttonPanel.setBackground(new Color(0x0d1b2a));
// Grid oder Flow
buttonPanel.setLayout(new GridLayout(1, 4, 10, 0));
// Style (optional)
btnFirst.setBackground(new Color(0x212529)); btnFirst.setForeground(Color.WHITE);
btnPrev.setBackground(new Color(0x212529)); btnPrev.setForeground(Color.WHITE);
btnNext.setBackground(new Color(0x212529)); btnNext.setForeground(Color.WHITE);
btnLast.setBackground(new Color(0x212529)); btnLast.setForeground(Color.WHITE);
// Hinzufügen
buttonPanel.add(btnFirst);
buttonPanel.add(btnPrev);
buttonPanel.add(btnNext);
buttonPanel.add(btnLast);
// Unten ins BorderLayout
statsPanel.add(buttonPanel, BorderLayout.SOUTH);
return statsPanel;
}
public String showPromotionDialog(String color) {
String[] choices = {"Dame", "Turm", "Springer", "Läufer"};
String choice = (String) JOptionPane.showInputDialog(
null,
color + "er Bauer wird umgewandelt wähle Figur:",
"Bauernumwandlung",
JOptionPane.PLAIN_MESSAGE,
null,
choices,
choices[0]);
if (choice == null) return "QUEEN";
switch (choice) {
case "Turm": return "ROOK";
case "Springer": return "KNIGHT";
case "Läufer": return "BISHOP";
default: return "QUEEN";
}
}
public void updateMoveList(List<String> moves) {
moveListPanel.removeAll();
for (String move : moves) {
JLabel moveLabel = new JLabel(move);
moveLabel.setForeground(Color.WHITE);
moveLabel.setFont(new Font("SansSerif", Font.PLAIN, 18));
moveListPanel.add(moveLabel);
}
moveListPanel.revalidate();
moveListPanel.repaint();
}
public JLabel getField(int row, int col) {
return fields[row][col];
}
public JButton getFlipBoardButton() {
return flipBoardButton;
}
public boolean isFlipped() {
return isFlipped;
}
public void setFlipped(boolean flipped) {
this.isFlipped = flipped;
}
public JButton getBtnFirst() { return btnFirst; }
public JButton getBtnPrev() { return btnPrev; }
public JButton getBtnNext() { return btnNext; }
public JButton getBtnLast() { return btnLast; }
public void updateBoard(BoardDTO boardDTO) {
PieceDTO[][] board = boardDTO.getBoard();
if (!isFlipped) {
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
PieceDTO piece = board[row][col];
fields[row][col].setText(piece != null ? piece.getUnicodeSymbol() : "");
}
}
} else {
// Invertiere Zeilen und Spalten
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
PieceDTO piece = board[7 - row][7 - col];
fields[row][col].setText(piece != null ? piece.getUnicodeSymbol() : "");
}
}
}
}
public void displayMessage(String msg) {
JOptionPane.showMessageDialog(null, msg);
}
}