Swing JLayeredPane Schach

G

GuestMike

Gast
Schönen guten Abend,
wie mein Titel schon sagt, ich bin dabei ein Schach zu programmieren. Ich habe mir das ganze mit einem LayeredPane vorgestellt. AU dem eien Layer sind meine FIguren und ein paar Layer dadrunter mein Brett. Ich realisiere das ganze mit 2 JLabel[] (eines für das Brett eines für die Figuren. Jedes Array hat ein eigenes Panel welches ich dem LayeredPane übergebe. Nur leider zeigt er nur ein JPanel bei mir an. Entweder das ,welches ich als erstes adde oder auf layer 0 packe.

Java:
public class GamePanel extends javax.swing.JLayeredPane {

	JLabel[][] gameLabelField;
	JLabel[][] gameLabelCharacters;

	public GamePanel() {

		this.setLayout(new FlowLayout());
		JPanel fieldPanel = new JPanel();
		JPanel characterPanel = new JPanel();
		fieldPanel.setBounds(1, 1, 528, 528);
		characterPanel.setBounds(1, 1, 528, 528);
		this.add(characterPanel, 10);
		this.add(fieldPanel, 11);
		fieldPanel.setLayout(new GridLayout(8, 8, 1, 1));
		characterPanel.setLayout(new GridLayout(8, 8, 1, 1));
		this.gameLabelField = new JLabel[8][8];
		this.gameLabelCharacters = new JLabel[8][8];
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				this.gameLabelCharacters[i][j] = new JLabel();
				this.gameLabelField[i][j] = new JLabel();
				fieldPanel.add(gameLabelField[i][j]);
				characterPanel.add(gameLabelCharacters[i][j]);
				if ((j + i) % 2 == 0) {
					gameLabelField[i][j].setIcon(new ImageIcon("Dark_Brown.png"));
				} else {
					gameLabelField[i][j].setIcon(new ImageIcon("Light_Brown.png"));
				}
			}

		}
		this.gameLabelCharacters[5][5].setIcon(new ImageIcon("Black_Rook.png"));
		
	}

	public static void main(String args[]) {
		JFrame frame = new JFrame("Test");
		frame.add(new GamePanel());
		frame.setSize(8 * 64 + 16, 8 * 64 + 16);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		System.out.println(frame.getLayeredPane().getComponentsInLayer(100).toString());

	}
}

Danke euch für eure Hilfe
 

Michael...

Top Contributor
Dem LayeredPane kein (Flow)Layout zuweisen und
Code:
characterPanel.setOpaque(false);
setzen, da ein JPanel standardmässig nicht transparent ist.

Die Hintergrundbilder
Code:
new ImageIcon("Dark_Brown.png");
(ebenso Light_Brown) nur einmal vor der Schleife erzeugen und in der Schleife einfach zuweisen. Die Bilder kann man mehrmals verwenden ;-)


Ich persönlich denke, dass - wenn da tatsächlich ein richtiges Schachspiel draus werden soll - Du so auf Dauer nicht glücklich wirst. Ich würde ein Feld als eine Einheit / ein Objekt behandeln, welches eine Farbe/Hintergrund besitzt und entweder leer oder von einer Figur besetzt ist.
 
G

GuestMike

Gast
Ich persönlich denke, dass - wenn da tatsächlich ein richtiges Schachspiel draus werden soll - Du so auf Dauer nicht glücklich wirst. Ich würde ein Feld als eine Einheit / ein Objekt behandeln, welches eine Farbe/Hintergrund besitzt und entweder leer oder von einer Figur besetzt ist.


Mit welcher Klasse kann ich das denn gut als ein Objekt behandeln?
 

Michael...

Top Contributor
Mit welcher Klasse kann ich das denn gut als ein Objekt behandeln?
Mit einer selbstgeschriebenen ;-) Genauso würde ich für die Figuren eine eigene Klasse schreiben, die die Eigenschaften und Regeln der unterschiedlichen Figuren verwaltet.
z.B.:
Java:
public class SchachFeld {
    private Icon hintergrundBild;
    private SpielFigur figur = null; // eigens definierte Klasse Figur
    
    public SchachFeld(Icon hintergrundBild) {
        this.hintergrundBild = hintergrundBild;
    }
    
    public void setzeFigur(Figur figur) {
        this.figur = figur
    }

    usw...
}
 
G

GuestMike

Gast
Wir benutzen schon eine eigene Klasse für die Figuren (Chess_Character)

Wir haben kein Problem mit der Semantik des eigentlichen Schachs, vielmehr haben wir ein Problem die GUI so umzusetzen wie du es vorgeschlagen hast.

Funktion unseres Schaches:

Wir haben unseren Controller, der 2 Chess_Player instanziiert, die wiederrum je 16 mal Chess_Character aufrufen, um die 16 Figuren zu erstellen. Chess_Character beinhaltet die Attribute: Character_Color color (Enum aus BLACK und WHITE (zur späteren Überprüfung, ob Feind oder Freund)), Character_Name name(ENUM aus den Figuren: KNIGHT, PAWN, QUEEN, KING, BISHOP, ROOK, damit wird später im Controller kontrolliert welche Schritte die in der GUI angewählte Figur machen kann) und zuletzt Position point (zur Zuordnung der Figur).

Durch diese Funktionen finde ich es unnötig das Schachbrett als eigenes Objekt zu behandeln, da es nur zur AUsgabe dient und jede FIgur seine eigene Position unabhängig vom Brett weiss.
 

Michael...

Top Contributor
Wir benutzen schon eine eigene Klasse für die Figuren (Chess_Character)
Da Ihr da schon was habt und da die Figur ihre aktuelle Position kennt, ist mein Vorschlag hinfällig.
Ich bin das gedanktlich etwas anders - ausgehend von der Hardware - angegangen. Bin von dummen Figuren ausgegabnen und nur das Model kennt die Position der Figuren.

Dennoch würde ich das nicht mit den JLabels und dem LayeredPane machen. Ich würde einfach eine Klasse Schachbrett extends JComponent machen, die auf das Model bzw. die Positionsdaten der Figuren zugreifen kann. Diese Klasse zeichnet selbst das Schachbrettmuster und anschliessend an den jeweiligen Positionen die Bilder der Schachfiguren. Ist nur ein Vorschlag...

Das mit dem LayeredPane sollte ja jetzt funktionieren?
 
G

GuestMike

Gast
Nein ...-.-

Ich habe mir mal ein Testprogramm erstellt, wo ich das ganze mit einem JLP in dem Frame mit einem BorderLayout in Center Position gesetzt habe, aber es funktioniert nicht....


Java:
public class Test extends JFrame {

	public Test() {
		
		this.setLayout(new BorderLayout());

		JLayeredPane pane = new JLayeredPane();
		
                          JPanel panel = new JPanel();
		panel.add(pane);
		panel.setSize((8*64)+9, (8*6)+9);
		pane.setSize((8*64)+9, (8*6)+9);

		JLabel east = new JLabel("east");

		JLabel west = new JLabel("west");

		JLabel north = new JLabel("north");
		north.setHorizontalAlignment(JLabel.CENTER);

		JLabel south = new JLabel("south");
		south.setHorizontalAlignment(JLabel.CENTER);

		JPanel fieldPanel = new JPanel();
		JPanel characterPanel = new JPanel();

		this.add(east, BorderLayout.LINE_END);
		this.add(west, BorderLayout.LINE_START);
		this.add(north, BorderLayout.PAGE_START);
		this.add(south, BorderLayout.PAGE_END);

		pane.add(characterPanel, 2);
		pane.add(fieldPanel, 1);

		characterPanel.setOpaque(false);
		
		JLabel[][] gameLabelField = new JLabel[8][8];
		JLabel[][] gameLabelCharacters = new JLabel[8][8];
		
		characterPanel.setOpaque(false);
		ImageIcon d_brown = new ImageIcon("Dark_Brown.png");
		ImageIcon l_brown = new ImageIcon("Light_Brown.png");
		
		fieldPanel.setLayout(new GridLayout(8, 8, 1, 1));
		characterPanel.setLayout(new GridLayout(8, 8, 1, 1))

		gameLabelField = new JLabel[8][8];
		gameLabelCharacters = new JLabel[8][8];

		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				gameLabelCharacters[i][j] = new JLabel();
				gameLabelField[i][j] = new JLabel();
				fieldPanel.add(gameLabelField[i][j]);
				characterPanel.add(gameLabelCharacters[i][j]);
				if ((j + i) % 2 == 0) {
					gameLabelField[i][j].setIcon(d_brown);
				} else {
					gameLabelField[i][j].setIcon(l_brown);
				}
			}

		}
		this.add(panel, BorderLayout.CENTER);
		gameLabelCharacters[5][5].setIcon(new ImageIcon("Black_Rook.png"));
 

Michael...

Top Contributor
Das setBounds auf characterPanel und fieldPanel fehlt.
Ansonsten ist das eine Panel unnötig und manches ist doppelt.
Und ein bisschen Ordnung im Code hilft Fremden (und auch dem Autor selbst) beim Lesen des Codes.

Java:
public class Test extends JFrame {

	public static void main(String[] s) {
		JFrame frame = new Test();
		frame.setBounds(0, 0, 200, 200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	public Test() {
        int fieldSize = 8*64 + 9;
        
        JLayeredPane pane = new JLayeredPane();
        this.getContentPane().add(pane, BorderLayout.CENTER);
        
        JLabel label;
        String[] text = {"East", "West", "North", "South"};
        for (int i=0; i<text.length; i++) {
        	label = new JLabel(text[i], JLabel.CENTER);
        	this.getContentPane().add(label, text[i]);
        }
 
        JPanel fieldPanel = new JPanel();
        fieldPanel.setLayout(new GridLayout(8, 8, 1, 1));
        fieldPanel.setBounds(0, 0, fieldSize, fieldSize);
        
        JPanel characterPanel = new JPanel();
        characterPanel.setOpaque(false);
        characterPanel.setLayout(new GridLayout(8, 8, 1, 1));
        characterPanel.setBounds(0, 0, fieldSize, fieldSize);
 
        pane.add(characterPanel, 2);
        pane.add(fieldPanel, 1);
        
        JLabel[][] gameLabelField = new JLabel[8][8];
        JLabel[][] gameLabelCharacters = new JLabel[gameLabelField.length][gameLabelField[0].length];
        
        ImageIcon d_brown = new ImageIcon("Dark_Brown.png");
        ImageIcon l_brown = new ImageIcon("Light_Brown.png");
 
        for (int i = 0; i < gameLabelField.length; i++) {
            for (int j = 0; j < gameLabelField[i].length; j++) {
                gameLabelCharacters[i][j] = new JLabel();
                gameLabelField[i][j] = new JLabel();
                fieldPanel.add(gameLabelField[i][j]);
                characterPanel.add(gameLabelCharacters[i][j]);
                if ((j + i) % 2 == 0) {
                    gameLabelField[i][j].setIcon(d_brown);
                } else {
                    gameLabelField[i][j].setIcon(l_brown);
                }
            }
 
        }
        gameLabelCharacters[5][5].setIcon(new ImageIcon("Black_Rook.png"));
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
S Swing JLayeredPane Anordnung funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing JLayeredPane "Phänomen"? AWT, Swing, JavaFX & SWT 7
E Swing JPanel in JLayeredPane animieren AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
T JLayeredPane in JScrollBox AWT, Swing, JavaFX & SWT 2
GUI-Programmer Swing Problem mit JLayeredPane AWT, Swing, JavaFX & SWT 2
M JLayeredPane mit JPanel im Vordergrund, Hintergrundelemente sperren AWT, Swing, JavaFX & SWT 7
G JPanel in JLayeredPane AWT, Swing, JavaFX & SWT 8
D Probleme mit MouseWheelListener und JLayeredPane in Applet AWT, Swing, JavaFX & SWT 2
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
R JLayeredPane - JPanel mit variabler Form AWT, Swing, JavaFX & SWT 4
J Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund AWT, Swing, JavaFX & SWT 5
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
R Swing JLayeredPane - Wie JScrollPane einbauen? AWT, Swing, JavaFX & SWT 17
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
H Button auf Bild/ JLayeredPane in Jpanel AWT, Swing, JavaFX & SWT 15
G JLayeredPane moveToFront funktioniert nicht AWT, Swing, JavaFX & SWT 15
D jLayeredPane Ebenen mit dynamischer Größe AWT, Swing, JavaFX & SWT 2
B Ärger mit JLayeredPane :-( AWT, Swing, JavaFX & SWT 5
S JLayeredPane AWT, Swing, JavaFX & SWT 16
M JLayeredPane : Applet - Application AWT, Swing, JavaFX & SWT 4
V JLayeredPane wird nur 1x bezeichnet AWT, Swing, JavaFX & SWT 12
shiny_hair JLayeredPane - Wie funktioniert das mit den Layern? AWT, Swing, JavaFX & SWT 2
T JLayeredPane Problem - AWT und SWING Komponente AWT, Swing, JavaFX & SWT 6
M Scrollbare JLayeredPane AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben