setBounds & co.

Schadstoff

Mitglied
Guten Abend allerseits. :)
Momentan bin ich dabei mir "Learnin' by Doin" und mit Google Java beizubringen.
Mein Vorhaben ist ein Schach Spiel zu programmieren. Die Umsetzung habe ich soweit auch schon geplant.
IDE ist NetBeans 691.

Allerdings scheitere ich gerade total beim Einstellen der Größes des Buttons! *facepalm*
Er gibt zwar keinen Fehler aus, aber es wird überhaupt nicht auf das setBounds geachtet. Sprich die Buttons werden nicht in " 25*25 " erstellt sondern alle nacheinander angelegt, durch verkleinern des Fensters werden die Buttons halt untereinander angereiht.
Scheint ja ein bekannter Fehler zu sein. Allerdings finde ich keine brauchbare Lösung. Ich werde wahrscheinlich einen simplen Anfänger Fehler begehen aber bis jetzt konnte ich mir einfach noch nicht selbst weiter helfen.
Java:
JButton[] buttons = new JButton[63];

  for(int i=0;i<63;i++){
  frame.add(buttons[i]); //auch mit this.add probiert
  buttons[i] = new JButton();
  buttons[i].setBounds(5, (i*5)+5, 25, 25);
  //buttons[i].setLocation(5+(i*5),5);
  //buttons[i].setSize(25,25);
  //buttons[i].setNormalBounds(5, (i*5)+5, 25, 25);
  //buttons[i].setPreferredSize(new Dimension(50, 100));
}

add(buttons) habe ich sowohl vor als auch hinter die setBounds gestellt. Hat auch nicht geholfen.
Habe die Ausrichtung der Buttons auch ohne Variabeln ausprobiert. Brachte auch keinen Erfolg.

Selbstverständlich habe ich dann erst mal "gegoogelt"/die interne Suchfunktion benutzt und die kommentierten Einstellungen gefunden.

setLocation/Size hat genauso wenig wie setBounds funktioniert.
setNormalBounds kannte NetBeans nicht und bei setPreferredSize unterstreicht es Dimension rot.

Ich hoffe Ihr könnt mir helfen und zerlegt mich nicht gleich in der Luft :oops:
Liebe Grüße :)
 

Marco13

Top Contributor
Der Einstieg wäre Lesson: Laying Out Components Within a Container (The Java™ Tutorials > Creating a GUI With JFC/Swing)

Es empfiehlt sich übrigens, als "oberste" Component nicht direkt den JFrame zu verwenden, sondern stattdessen ein JPanel, das man dann in die ContentPane eines JFrames legt.

Java:
JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel);

Bei dir könnte das JPanel dann ein GridLayout haben, aber vermutlich willst du noch andere Buttons unterbringen (irgendwelche Kontroll-Buttons), deswegen würde man dann irgendwie schachteln. Ich persönlich finde es ganz praktisch, das grob in Methoden widerzuspiegeln:

Java:
void init()
{
    JPanel mainPanel = new JPanel(new BorderLayout());

    mainPanel.add(createBoardPanel(), BorderLayout.CENTER);
    mainPanel.add(createControlPanel(), BorderLayout.SOUTH);
    
    frame.getContentPane().add(mainPanel);

}

JPanel createBoardPanel()
{
    JPanel boardPanel = new JPanel(new GridLayout(8,8));
    for (int i=0; i<64; i++)
    {
        JButton button = erstelleButton(i);
        boardPanel.add(button);
    }
    return boardPanel;
}

JPanel createControlPanel()
{
    JPanel controlPanel = ...
    return controlPanel;
}

Ob JButtons für die Felder eines Schachbrettes die geeignetste Wahl sind... da habe ich Zweifel... aber wenn's nur um "Rumspielen" zum Swing-Kennenlernen geht, ist das vielleicht nicht sooo wichtig...
 

Schadstoff

Mitglied
Um das mal zu pfostieren.
Bin ein gutes Stück weitergekommen.
Allerdings habe ich gerade eine totale Blockade.Sitze schon zulange davor brauch mal ne kleine Pause..


edit: ich weiß es ist sehr dürftig kommentiert und leicht unordentlich..:oops:
Bin halt noch in der experimentier phase..
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Test.java
 *
 * Created on 18.09.2010, 09:51:44
 */
package java_chess;

import javax.swing.*;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.*;
import java.awt.event.*;

/**
 *
 * @author xxx
 */
public class Test extends javax.swing.JFrame {
    
    private static JFrame frame = null;
    public static int[][] felder = new int[64][6];//[x][0: pos 1: akt. farbe(1w/2s) 2: akt. figur(1König/2Dame/3Läufer/4Springer/5Turm/6Bauer 3:bg bild 4:hg farbe 5:besetzt]
    public static JButton[] buttons = new JButton[64];
    public static int actPlayer; //0=w 1=s
    public static int moveBauerC;
    public static int clicked;
    public static int done;

    public void moveBauer(int i) {
       // System.out.print("    |i:"+i+"    |clicked:"+clicked+"|    ");
        if ((i-8==clicked && moveBauerC==8) || (i-8==clicked && moveBauerC==16) || (i-16==clicked && moveBauerC==16) ){
              System.out.print("     CC|"+clicked+"|            actPlayer:"+actPlayer+"              |");
            if (moveBauerC==8 || moveBauerC==16){
            if (moveBauerC==8){felder[i][1]=1;felder[i][2]=6;
                               felder[clicked][1]=0;felder[clicked][2]=0;int done=1;}
            for(int j=0;j<64;i++){
            setFigurPicture(j);
                }
                    if ((i-16==clicked && moveBauerC==16)){
              System.out.print("     CC|"+clicked+"|            actPlayer:"+actPlayer+"              |");

            if (moveBauerC==8){felder[i][1]=1;felder[i][2]=6;
                               felder[clicked][1]=0;felder[clicked][2]=0;int done=1;}
            for(int j=0;j<64;i++){
            setFigurPicture(j);
                }
                }
            }
        
        }
            if(done==1){ if (actPlayer == 1){ actPlayer = 0; } if (actPlayer == 0){ actPlayer = 1; } }

        clicked=i;
        //System.out.print("___"+i+"___");
        for (int j = 0; j < 64; j++) {
        setNormalBgColor(j);
        }



        if (done==0){
        if (felder[i + 8][5] == 0 && felder[i + 16][5] == 1) {
            buttons[i + 8].setBackground(Color.green);
            felder[i+8][2]=6;
            felder[i+8][1] = actPlayer;
            moveBauerC=8;
            buttons[i + 16].setBackground(Color.red);
            buttons[i + 16].setEnabled(false);
        } else if (felder[i + 8][5] == 0 && felder[i + 16][5] == 0) {
            buttons[i + 8].setBackground(Color.green);
            buttons[i + 16].setBackground(Color.green);
             moveBauerC=16;
        } else if (felder[i + 8][5] == 1) {
            buttons[i + 8].setBackground(Color.red);
            buttons[i + 8].setEnabled(false);
            buttons[i + 16].setBackground(Color.red);
            buttons[i + 16].setEnabled(false);
        }
                }
            }
        
    

    
    

    public void move(int i) {
        //System.out.print("" + i); // ENTWICKLER BEFEHL
        if (felder[i][1] == actPlayer) { //Falls das ausgewählte Feld dem aktuellen Spieler gehört
            if (felder[i][2] == 6) {  //Falls auf dem ausgewählten Feld ein Bauer steht
                moveBauer(i);
                setFigurPicture(i);
            }
        }

    }

    public void setFigurPicture(int i) {
        if (felder[i][1] == 0) {
            buttons[i].setText("L" + i);
            felder[i][5] = 0;
        }
        if (felder[i][1] == 1) { //FALLS FARBE WEISS
            if (felder[i][2] == 6) {
                //buttons[i].setIcon(weiß_bauer);
                buttons[i].setText("wB");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 5) {
                //buttons[i].setIcon(weiß_turm);
                buttons[i].setText("wT");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 4) {
                //buttons[i].setIcon(weiß_springer);
                buttons[i].setText("wS");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 3) {
                //buttons[i].setIcon(weiß_laufer);
                buttons[i].setText("wL");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 2) {
                //buttons[i].setIcon(weiß_dame);
                buttons[i].setText("wD");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 1) {
                //buttons[i].setIcon(weiß_konig);
                buttons[i].setText("wK");
                felder[i][5] = 1;
            }

        }
        ////////////////////////
        if (felder[i][1] == 2) { //FALLS FARBE WEISS
            if (felder[i][2] == 6) {
                //buttons[i].setIcon(schwarz_bauer);
                buttons[i].setText("sB");
            }
            if (felder[i][2] == 5) {
                //buttons[i].setIcon(schwarz_turm);
                buttons[i].setText("sT");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 4) {
                //buttons[i].setIcon(schwarz_springer);
                buttons[i].setText("sS");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 3) {
                //buttons[i].setIcon(weiß_laufer);
                buttons[i].setText("sL");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 2) {
                //buttons[i].setIcon(schwarz_dame);
                buttons[i].setText("sD");
                felder[i][5] = 1;
            }
            if (felder[i][2] == 1) {
                //buttons[i].setIcon(schwarz_konig);
                buttons[i].setText("sK");
                felder[i][5] = 1;
            }

        }
    }

    public void setNormalBgColor(int i){
                   int iRest = i % 2;
            if (iRest > 0) { //ungerade
                felder[i][4] = 1;
                if (i >= 0 && i < 8) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i >= 8 && i < 16) {
                    buttons[i].setBackground(Color.white);
                }
                if (i > 15 && i < 24) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i > 23 && i < 32) {
                    buttons[i].setBackground(Color.white);
                }
                if (i > 31 && i < 40) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i > 39 && i < 48) {
                    buttons[i].setBackground(Color.white);

                }
                if (i > 47 && i < 56) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i > 55 && i < 64) {
                    buttons[i].setBackground(Color.white);
                }

            } else {         //gerade
                if (i >= 0 && i < 8) {
                    buttons[i].setBackground(Color.white);
                    buttons[i].setForeground(Color.black);

                }

                if (i >= 8 && i < 16) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }

                if (i >= 15 && i < 24) {
                    buttons[i].setBackground(Color.white);
                }
                if (i > 23 && i < 32) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i > 31 && i < 40) {
                    buttons[i].setBackground(Color.white);
                }
                if (i > 39 && i < 48) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
                if (i > 47 && i < 56) {
                    buttons[i].setBackground(Color.white);
                }
                if (i > 55 && i < 64) {
                    buttons[i].setBackground(Color.black);
                    buttons[i].setForeground(Color.white);
                }
            }
    }


    public void startgame() {
        this.setLayout(null);
        actPlayer = 1;

        for (int i = 0; i < 64; i++) {
            buttons[i] = new JButton();

            felder[i][0] = i + 1; // position einstellen.

            setNormalBgColor(i);

            if (i == 0 || i == 7 || i == 56 || i == 63) {
                felder[i][2] = 5;
            }
            if (i == 1 || i == 6 || i == 57 || i == 62) {
                felder[i][2] = 4;
            }
            if (i == 2 || i == 5 || i == 58 || i == 61) {
                felder[i][2] = 3;
            }
            if (i == 4 || i == 60) {
                felder[i][2] = 2;
            }
            if (i == 3 || i == 59) {
                felder[i][2] = 1;
            }
            if (i < 8) {
                buttons[i].setLocation(5 + (i * 55), 5);
                felder[i][1] = 1;
            }
            if (i < 16 && i > 7) {
                buttons[i].setLocation(5 + ((i - 8) * 55), 60);
                felder[i][1] = 1;
                felder[i][2] = 6;
            }
            if (i < 24 && i > 15) {
                buttons[i].setLocation(5 + ((i - 16) * 55), 115);
            }
            if (i < 32 && i > 23) {
                buttons[i].setLocation(5 + ((i - 24) * 55), 170);
            }
            if (i < 40 && i > 31) {
                buttons[i].setLocation(5 + ((i - 32) * 55), 225);
            }
            if (i < 48 && i > 39) {
                buttons[i].setLocation(5 + ((i - 40) * 55), 280);
            }
            if (i < 56 && i > 47) {
                buttons[i].setLocation(5 + ((i - 48) * 55), 335);
                felder[i][1] = 2;
                felder[i][2] = 6;
            }
            if (i < 64 && i > 55) {
                buttons[i].setLocation(5 + ((i - 56) * 55), 390);
                felder[i][1] = 2;
            }

            buttons[i].setText("" + i); //Entwickler Befehl
            buttons[i].setSize(55, 55);
            buttons[i].setVisible(true);
            final int k = i;

            buttons[i].addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    move(k);
                }
            });

            this.add(buttons[i]);

            // Icon weiß_bauer = new ImageIcon("C:/Users/LSC/Pictures/Selfmade/icon.gif");

            setFigurPicture(i);

        }// ENDE FOR
    } // ENDE STARTGAME()

    /** Creates new form Test */
    public Test() {
        initComponents();
        startgame();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Schach v0.2 ");
        setBounds(new java.awt.Rectangle(50, 0, 1000, 1000));
        setResizable(false);

        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(557, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(454, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        felder[22][5] = 1;
        felder[31][5] = 1;

//       startgame();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Test().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    // End of variables declaration
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm. Ein bißchen "drauf los schreiben" um ein bißchen in Swing reinzukommen ist ja ganz OK, aber ... ... ... ohne dich jetzt zu sehr desillusionieren oder demotivieren zu wollen: Mit diesem Ansatz wirst du nicht weit kommen. Als Gründe dafür könnte man (neben der oben schon angedeuteten Frage, ob man die Felder wirklich als JButtons haben will) noch eine ganze Liste aufführen. Angefangen dabei, ob man das Feld als so einen seltsamen int-Array repräsentieren will. Es kann zwar durchaus sinnvoll sein, das feld als int[] array zu machen, aber nur wenn man GENAU weiß, was man da tut, und GENAU weiß, wie man die relevanten Daten repräsentieren kann. Da kommen sehr viele Aspekte dazu, die man am Anfang nicht bedenkt. Aber selbst wenn man vom dramatisch-einfachsten Fall ausgeht (ein Spiel, wo zwei Spieler wie auf einem echten Brett gegeneinander spielen, OHNE Überprüfung der Schachregeln und natürlich OHNE KI), und WENN man sich (trotzdem, auch wenn dafür dann kein Grund mehr besteht) dazu entschließt, das Brett als einen int-Array zu repräsentieren (und nicht etwa als ein
Java:
class Board
{
    public Piece getPiece(int x, int y) { ... }
    public void setPiece(int x, int y, Piece piece) { ... }
}
sollte man zumindest diese unsäglichen Zahlen da raus kriegen. Also nicht
Java:
felder[n][0] = 1; // Weißer...
felder[n][1] = 5; // ...Turm
sondern sowas wie
Java:
private static final int WHITE_KING = 0x11;
..
private static final int WHITE_ROOK = 0x15;
private static final int BLACK_ROOK = 0x25;
...

felder[n] = WHITE_ROOK;
Diese gräßlichen, undurchsichtigen if-Kaskaden, die du da drin hast, sollten auch nicht nötig sein. Vielleicht wäre dann ein "int board[zeilen][spalten]" einfacher...

Wobei das alles auch noch unübersichtlich und unhandlich wäre, im Vergleich zu einer "Board"-Klasse....
 

Schadstoff

Mitglied
Hm. Ein bißchen "drauf los schreiben" um ein bißchen in Swing reinzukommen ist ja ganz OK, aber ... ... ... ohne dich jetzt zu sehr desillusionieren oder demotivieren zu wollen: Mit diesem Ansatz wirst du nicht weit kommen. Als Gründe dafür könnte man (neben der oben schon angedeuteten Frage, ob man die Felder wirklich als JButtons haben will) noch eine ganze Liste aufführen. Angefangen dabei, ob man das Feld als so einen seltsamen int-Array repräsentieren will. Es kann zwar durchaus sinnvoll sein, das feld als int[] array zu machen, aber nur wenn man GENAU weiß, was man da tut, und GENAU weiß, wie man die relevanten Daten repräsentieren kann. Da kommen sehr viele Aspekte dazu, die man am Anfang nicht bedenkt. Aber selbst wenn man vom dramatisch-einfachsten Fall ausgeht (ein Spiel, wo zwei Spieler wie auf einem echten Brett gegeneinander spielen, OHNE Überprüfung der Schachregeln und natürlich OHNE KI), und WENN man sich (trotzdem, auch wenn dafür dann kein Grund mehr besteht) dazu entschließt, das Brett als einen int-Array zu repräsentieren (und nicht etwa als ein
Java:
class Board
{
    public Piece getPiece(int x, int y) { ... }
    public void setPiece(int x, int y, Piece piece) { ... }
}
sollte man zumindest diese unsäglichen Zahlen da raus kriegen. Also nicht
Java:
felder[n][0] = 1; // Weißer...
felder[n][1] = 5; // ...Turm
sondern sowas wie
Java:
private static final int WHITE_KING = 0x11;
..
private static final int WHITE_ROOK = 0x15;
private static final int BLACK_ROOK = 0x25;
...

felder[n] = WHITE_ROOK;
Diese gräßlichen, undurchsichtigen if-Kaskaden, die du da drin hast, sollten auch nicht nötig sein. Vielleicht wäre dann ein "int board[zeilen][spalten]" einfacher...

Wobei das alles auch noch unübersichtlich und unhandlich wäre, im Vergleich zu einer "Board"-Klasse....

Das mit der Board Klasse ist eigtl ne geniale Idee :oops:

Werde dann mal eine 2. Version starten.

Vielen Dank für die Mühe und die konstruktive Kritik :)

Ach und auf die Idee mit dem "int board[x][y][eigenschaften]" hätte ich ja auch mal selbst kommen können! :oops:
 
Zuletzt bearbeitet:

Schadstoff

Mitglied
Java:
package java_chess;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
 
public class NewChess extends JFrame implements MouseListener, MouseMotionListener {
    JLayeredPane layeredPane;
    JPanel chessBoard;
    JLabel chessPiece;
    int xAdjustment;
    int yAdjustment;
    JComponent orignalsquare;
    int sx,sy;
    int dx,dy;

    int x,y;
    public NewChess(){
        Dimension boardSize = new Dimension(600, 600);


         layeredPane = new JLayeredPane();
        getContentPane().add(layeredPane);
        layeredPane.setPreferredSize(boardSize);
        layeredPane.addMouseListener(this);
        layeredPane.addMouseMotionListener(this);

        chessBoard = new JPanel();
        layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
        chessBoard.setLayout( new GridLayout(8, 8) );
        chessBoard.setPreferredSize( boardSize );
        chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
 boolean flag=false;
        for (int j = 0; j < 8; j++) {
if(j%2==0){
flag=false;
} else if (j % 2 == 1){
flag=true;}
for(int i=0;i<8;i++){
            JPanel square = new JPanel( new BorderLayout() );
            chessBoard.add( square );
 if(flag==true)
            square.setBackground( i % 2 == 0 ? Color.black : Color.white );
            else
                square.setBackground( i % 2 == 0 ? Color.white : Color.black );
	        }
        }

           
        for(int i=8;i<16;i++){
        System.out.print(""+ i + " : " +(JPanel)chessBoard.getComponent(i) + "\r\n") ;
        JLabel label = new JLabel("WPAWN");
        label.setForeground(Color.red);
        JPanel panel = (JPanel)chessBoard.getComponent(i);
        panel.add(label);
        }
    }
    
    public void mousePressed(MouseEvent e){
         chessPiece = null;
         Component c =  chessBoard.findComponentAt(e.getX(), e.getY());
         x=e.getX();
         y=e.getY();

        //sx=source x
        sx=(e.getX())/75;   
        sy=(e.getY())/75;

        if (c instanceof JPanel) 
        return;
 	
        orignalsquare=(JComponent)c.getParent();
 
        Point parentLocation = orignalsquare.getLocation();
        xAdjustment = parentLocation.x - e.getX();
        yAdjustment = parentLocation.y - e.getY();
        chessPiece = (JLabel)c;
        chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);
        chessPiece.setSize(chessPiece.getWidth(), chessPiece.getHeight());
        layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
        System.out.print("\r\n xAdj: " + (parentLocation.x - e.getX()) + "\r\n yAdj: " + (parentLocation.y - e.getY()) + "\r\n pLx: " + parentLocation.x + "\r\n pLy: " + parentLocation.y + "\r\n");
    }


    public void mouseDragged(MouseEvent me) {
        if (chessPiece == null) return;
         chessPiece.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment);
     }


    public void mouseReleased(MouseEvent e) {
        if(chessPiece == null) return;

   //dx= destination x

dx=(e.getX())/75;


dy=(e.getY())/75;


if((sx==dx) || (sy==dy))
{
chessPiece.setVisible(false);
       Component c =  chessBoard.findComponentAt(e.getX(), e.getY());

        if (c instanceof JLabel){
       	orignalsquare.add(chessPiece);

}
        else {
            Container parent = (Container)c;
            parent.add( chessPiece );

        }
 		chessPiece.setVisible(true);

	   }
else

chessPiece.setLocation(x + xAdjustment, y + yAdjustment);

}

    public void mouseClicked(MouseEvent e) {

    }
    public void mouseMoved(MouseEvent e) {
   }
    public void mouseEntered(MouseEvent e){

    }
    public void mouseExited(MouseEvent e) {

    }



   public static void main(String[] args) {
        JFrame frame = new NewChess();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE );
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
     }
}

Aber jetzt steht trotzdem noch ein riesen If Chaos an .
 

Marco13

Top Contributor
Ich weiß nicht genau, an welcher Stelle.

Was ich jetzt irritierend finde ist, dass du scheinbar gar keine Repräsentation des Spielfeldes mehr hast, die NICHT aus GUI-Komponenten besteht?! Es scheint (für Anfänger) sehr verlockend zu sein, sowas hinzuschreiben wie
Java:
class MeinSpiel extends JFrame
{
    private JLabel spielfigur;

    public MeinSpiel()
    {
        super("Mein Spiel");
        spielfigur = new JLabel(new ImageIcon(loadImage("C:/Java/MeinSpiel/CoolesBild.jpg")));
        add(spielfigur);        
        setSize(800,600);
        setVisible(true);
    }
}
und dann erst anzufangen(!), zu überlegen, wie sie dieses Spiel denn umsetzen - und das NUR in bezug auf die Frage, welche JLabels und JButtons sie wo und wie auf den Bildschirm bringen müssen, damit das am Ende aussieht, wie ein Spiel.

Geh' davon aus, dass jedes auch scheinbar noch so triviale Spiel Strukturen und Abläufe enthält, die unabhängig sind von der Frage, "welche JLabels und JButtons wo auf dem Bildschirm liegen". Man könnte so weit gehen, zu sagen, dass Spiele wie "Tic Tac Toe" und "Schach" mehr Gemeinsamkeiten als Unterschiede haben. Bei geeigneter Abstraktion können tatsächlich sogar beide dieselbe KI verwenden!

Zu den if-Abfragen:

Aber bei der ursprünglichen Version hast du wohl (wenn ich das richtig überflogen hatte) versucht, for(i=0;i<64..) durch den Array zu laufen, und anhand abstruser if-Abfragen für das 'i' rauszufinden, welcher Spielstein dort gesetzt werden muss? Lass es :)

Für einen int-Array könnte man sowas machen wie
Java:
private static final int BP = 0x11; // BLACK PAWN
private static final int WP = 0x21; // WHITE PAWN
private static final int BR = 0x15; // BLACK ROOK
private static final int __ = 0x00; // EMPTY
...

private static final int initialBoard[][] = new int[][]
{
    { BR, BN, BB, BQ, BK, BB, BN, BR },
    { BP, BP, BP, BP, BP, BP, BP, BP },
    { __, __, __, __, __, __, __, __, },
    { __, __, __, __, __, __, __, __, },
    ...
    { WP, ...},

};
und das dann einfach in das "int aktuellesBoard[][]" reinkopieren.

Für eine Board-Klasse könnte man wegen des sehr speziellen Charakters der initialen Aufstellung aber ganz pragmatisch sowas machen wie
Java:
void initBoard(Board board)
{
    clearBoard(board); // Alle Steine entfernen
    board.set(0,0, blackRook);
    board.set(0,1, blackKnigh);
    ...
    board.set(7,7, whiteRook);
}
Schleifen und if-Abfragen kommen später schon noch genug ;)

Wenn du eine Board-Klasse und eine Piece-Klasse und eine Player-Klasse und eine Game-Klasse erstellen willst (was ich dir empfehlen würde) und diese Klassen erstmal und weitgehend unabhängig von Swing sein sollen (was ich dir auch empfehlen würde) dann solltest du dir erstmal überlegen, wie diese Klassen aussehen könnten.

Vermutlich ist für den Anfang einiges etwas leichter oder durschaubarer wenn die Klasse "Board" gleicht das passende JPanel enthält, und die Klasse "Piece" auch gleich das JLabel, mit dem sie auf dem JPanel des Boards gezeichnet wird. Aber eigentlich sollte man diese Sachen trennen. Ob die mit dieser Trennung verbundenen Aufände gerechtfertigt sind, wenn das "Rumspielen" bei diesem Spiel sich nicht auf das Spiel selbst, sondern eher auf das Erstellen des Spiels bezieht, weiß ich nicht....
 

Schadstoff

Mitglied
Okay hab dann mal alles in verschiedene Klassen unterteilt.
Jetzt überlege ich wie ich am besten das Feld / die Felder selbst umsetze.

Main.java
Java:
package chess;

import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                chess.GUI.createGUI(600, 600, "Schach v" + chess.Info.version);
                
                
            }
        });
    }
}

Player.java
Java:
package chess;


public class Player {

    public static int WPlayer = 0x0001;
    public static int BPlayer = 0x0002;

    public static void createPlayer(int i){} //Spieler erstellen.
    public static void resetPlayer(int i){} //Spieler resetten. (
    public static void getPlayer(int i){} //Spieler Informationen abfragen


public static void main(String[] args) {
            
    }
}

Board.java
Java:
package chess;

public class Board {
public static final int BK = 0x11; // BLACK KING
public static final int BQ = 0x12; // BLACK QUEEN
public static final int BB = 0x13; // BLACK BISHOP
public static final int BN = 0x14; // BLACK KNIGHT
public static final int BR = 0x15; // BLACK ROOK
public static final int BP = 0x16; // BLACK PAWN

public static final int WK = 0x21; // WHITE KING
public static final int WQ = 0x22; // WHITE QUEEN
public static final int WB = 0x23; // WHITE BISHOP
public static final int WN = 0x24; // WHITE KNIGHT
public static final int WR = 0x25; // WHITE ROOK
public static final int WP = 0x26; // WHITE PAWN

public static final int __ = 0x00; // EMPTY

    public void createBoard() {   //Board erstellen

    }
    public static void resetBoard() {}    //Alle Felder leer machen

    public static void move(int dx, int dy, int nx, int ny,int character) {
    initBoard[dy][dx] = __;
    initBoard[ny][nx] = character;
    }     //Figur setzen
    
    public static final int aktuellesBoard[][] = new int[7][7];
    public static final int initBoard[][] = new int[][]
{
    { BR, BN, BB, BQ, BK, BB, BN, BR },
    { BP, BP, BP, BP, BP, BP, BP, BP },
    { __, __, __, __, __, __, __, __ },
    { __, __, __, __, __, __, __, __ },
    { __, __, __, __, __, __, __, __ },
    { __, __, __, __, __, __, __, __ },
    { WP, WP, WP, WP, WP, WP, WP, WP },
    { WR, WN, WB, WQ, WK, WB, WN, WR },

};


    
    public static void main(String[] args) {
    for(int i=0;i<8;i++){
        for (int j=0;i<8;i++){
        aktuellesBoard[i][j] = initBoard[i][j];
        }
    }    
    }
    
}

GUI.java
Java:
package chess;
import javax.swing.*;

public class GUI {

     public static void createGUI(int x,int y,String titel){
        JFrame frame = new JFrame("" + titel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setSize(x,y);
    }


 public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {

            }
        });
    }

}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm. Das mit den int-Konstanten und so war nur ein Hinweis, wie man das machen könnte, wenn man einen int[][] als Board verwenden will. Mit einer eigenen Board-Klasse braucht man das vielleicht gar nicht mehr. Ansonsten... die ganzen statischen Methoden sollten da raus. Offenbar hakt es bei dem Versuch, ein bißchen Swing zu machen, in diesem Fall schon daran, dass das Kapitel "Objektorientierte Programmierung" offenbar übersprungen werden sollte ;)
 

Schadstoff

Mitglied
Hm. Das mit den int-Konstanten und so war nur ein Hinweis, wie man das machen könnte, wenn man einen int[][] als Board verwenden will. Mit einer eigenen Board-Klasse braucht man das vielleicht gar nicht mehr. Ansonsten... die ganzen statischen Methoden sollten da raus. Offenbar hakt es bei dem Versuch, ein bißchen Swing zu machen, in diesem Fall schon daran, dass das Kapitel "Objektorientierte Programmierung" offenbar übersprungen werden sollte ;)

wie muss ich die methoden deklarieren damit ich sie klassenübergreifend benutzen kann? hab das nur mit static hinbekommen..
 

Marco13

Top Contributor
Hmja. Das geht, wie angedeutet, jetzt schon in Richtung von Grundlagen, die nicht in aller Tiefe in ein paar Forenbeiträgen geklärt werden können. Nur kurz: Gar nicht :) Man verwendet Methoden i.a. nicht Klassenübergreifend (außer Utility-Methoden), sondern ruft sie immer auf Objekten auf.
Java:
class Board
{
    void clear() { /* Löscht das Spielfeld */ }
    ...
}

class Game
{
    void start()
    {
        // Hier kann man nicht die 'clear'-Methode aufrufen.
        // Und das ist auch gut und richtig so.
    }
}

Wenn man die Methoden aufrufen will, braucht man eine Instanz des jeweiligen Objektes:
Java:
class Game
{
    private Board board = new Board(); // Die instanz

    void start()
    {
        board.clear(); // Board löschen
    }
}

Deswegen Objekt-orientiert: Man hantiert mit Objekten rum. In diesem Fall mit so einem rechteckigen, karierten Objekt, das man als "ein Spielbrett" bezeichnet.
 

Schadstoff

Mitglied
Hmja. Das geht, wie angedeutet, jetzt schon in Richtung von Grundlagen, die nicht in aller Tiefe in ein paar Forenbeiträgen geklärt werden können. Nur kurz: Gar nicht :) Man verwendet Methoden i.a. nicht Klassenübergreifend (außer Utility-Methoden), sondern ruft sie immer auf Objekten auf.
Java:
class Board
{
    void clear() { /* Löscht das Spielfeld */ }
    ...
}

class Game
{
    void start()
    {
        // Hier kann man nicht die 'clear'-Methode aufrufen.
        // Und das ist auch gut und richtig so.
    }
}

Wenn man die Methoden aufrufen will, braucht man eine Instanz des jeweiligen Objektes:
Java:
class Game
{
    private Board board = new Board(); // Die instanz

    void start()
    {
        board.clear(); // Board löschen
    }
}

Deswegen Objekt-orientiert: Man hantiert mit Objekten rum. In diesem Fall mit so einem rechteckigen, karierten Objekt, das man als "ein Spielbrett" bezeichnet.

Also erstmal vielen Dank für die viele Mühe die Du dir mit mir gibst! :)
Ich habe jetzt leider gerade nur wenig Zeit, werde mir aber später mal zu herzen nehmen was du geschrieben hast.
Am besten begoogle ich mich nochmal bzgl. "oop". Habe mal eine Zeit lang php/mysql geschrieben. Wollte (und habe) damals auch ein recht zufriedenstellendes Forum geschrieben. Möchte damit nur andeuten ,dass mir das alles eigentlich garnicht so fremd ist. Stehe nur momentan irgendwie etwas auf dem Trichter..:oops:
Naja gut..

Viele liebe Grüße :)
 

Schadstoff

Mitglied
Ich kam die letzten Abende dann doch zu nichts. Habe mich heute Abend also mal drangesetzt

Java:
package chess2;

import javax.swing.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseListener;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

class var
{

    public static final int BK = 0x11; // BLACK KING
    public static final int BQ = 0x12; // BLACK QUEEN
    public static final int BB = 0x13; // BLACK BISHOP
    public static final int BN = 0x14; // BLACK KNIGHT
    public static final int BR = 0x15; // BLACK ROOK
    public static final int BP = 0x16; // BLACK PAWN
    public static final int WK = 0x21; // WHITE KING
    public static final int WQ = 0x22; // WHITE QUEEN
    public static final int WB = 0x23; // WHITE BISHOP
    public static final int WN = 0x24; // WHITE KNIGHT
    public static final int WR = 0x25; // WHITE ROOK
    public static final int WP = 0x26; // WHITE PAWN
    public static final int __ = 0x00; // EMPTY
}

class Game
{

    void Start(String arg) {
        System.out.println("test" + var.WP);
    }

void button1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_button1MouseClicked
    System.out.println(""+evt);
    }//GEN-LAST:event_button1MouseClicked


}

class Info
{

    String author = "Lucas Schad";
    int version = 4;
    String datum = "2010";
}

public abstract class Main extends Applet implements MouseListener
{

    public static void main(String[] args) {

        final Game game = new Game();
        GUI gui = new GUI();
        Info info = new Info();


        game.Start("");
        gui.createGUI(600, 600,
                      "Schach v" + info.version + " von " + info.author + " © " + info.datum);
        for (int row = 0; row < 8; row++) {
            for (int column = 0; column < 8; column++) {

                gui.panel[row][column].addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
               game.button1MouseClicked(evt);
            }
        });

                //gui.panel[row][column].addMouseListener();
                System.out.println(gui.panel[row][column].getBackground());
                //addMouseListener(gui.pane l[row][column]);
            }
        }
    }

}

class GUI
{

    public final static JPanel[][] panel = new JPanel[8][8];
    public static int i;
    public static int row;
    public static int column;

    void createGUI(int x, int y, String titel) {

        Border thickBorder = new LineBorder(Color.RED, 3); //mainPanel
        Border thickBorder2 = new LineBorder(Color.GREEN, 2); //panel


        JPanel mainPanel = new JPanel();
        mainPanel.setSize(600, 600);
        mainPanel.setLayout(new GridLayout(8, 8));
        mainPanel.setBorder(thickBorder);
        mainPanel.setVisible(true);


        JFrame frame = new JFrame("" + titel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setSize(x, y);
        frame.getContentPane().add(mainPanel);
        frame.setResizable(false);
        frame.setVisible(true);

        i = 0;

        for (int row = 0; row < 8; row++) {
            for (int column = 0; column < 8; column++) {
                //frame.add (new JButton(""+chess.Board.aktuellesBoard[row][column]));

                panel[row][column] = new JPanel();
                panel[row][column].setBorder(thickBorder2);
                mainPanel.add(panel[row][column]);
                panel[row][column].setToolTipText(
                        "x: " + (column + 1) + " y: " + (row + 1));
                if ((i % 2) == 1) {
                    if (row == 0 || row == 2 || row == 4 || row == 6 || row == 8) {
                        panel[row][column].setBackground(new java.awt.Color(0, 0,
                                                                            0));
                    }
                    if (row == 1 || row == 3 || row == 5 || row == 7) {
                        panel[row][column].setBackground(new java.awt.Color(240,
                                                                            240,
                                                                            240));
                    }
                } else if ((i % 2) == 0) {
                    if (row == 0 || row == 2 || row == 4 || row == 6 || row == 8) {
                        panel[row][column].setBackground(new java.awt.Color(240,
                                                                            240,
                                                                            240));
                    }
                    if (row == 1 || row == 3 || row == 5 || row == 7) {
                        panel[row][column].setBackground(new java.awt.Color(0, 0,
                                                                            0));
                    }
                }


                //panel[row][column].addMouseListener(this);


                i = i + 1;

            }
        }



    }

    void test(MouseEvent e) {
        System.out.print("gtxxxx:" + e.getX());
    }

}


Jezt habe ich das Problem, dass ich in die "GUI" klasse nicht impletieren kann. (sonst müsste ich sie abstrakt machen). Also gehe ich davon aus, dass ich das über die Main Klasse regeln muss. Aber so richtig bin ich da noch nicht durch gestiegen.
Viele Grüße :)

Edit: Habs hinbekommen.. ;)
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben