ButtonArray drehen

onek2705

Mitglied
Hallo,
Ich bin dabei ein Tetris spiel mithilfe von JButtons, die in einem Array angeordnet sind (so vorgegeben) zu programmieren. Durch den Button in der Main möchte ich nur erstmal dien Block I in meinem JPanel erzeugen und bei jedem weiteren mal auf den Knopf drücken um 90° drehen. Die Methode ArrayTurn zum drehen funktioniert an sich auch aber mein Problem ist, dass der Block beim drücken auf den Knopf in dem JPanel sich zwar drehen würde, aber man dies nicht sieht, da an den Positionen ja schon ein Objekt vorhanden ist.

Klasse für den Block:
Java:
package Figuren;

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Block extends JButton {
    
    public  Block (Color c,int posX, int posY,JPanel jp) {
        this.setBounds(posX, posY, 32, 32);
        this.setOpaque(true);
        this.setBorderPainted(false);
        this.setBackground(c);
    }
}


Klasse für die Figur I:
Java:
package Figuren;

import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.JPanel;

public class I  {
   
    private int[][] I10  = {{1, 0, 0, 0}, {1, 0, 0, 0} ,{1, 0, 0, 0}, {1, 0 ,0, 0}};
    private int[][] I1 = I10;
    public Block[][] I = new Block[4][4];
    public Block[][] I2 = I;
   
    public I (JPanel buene,int PosX,int PosY,int rotation,int erstellt) {
        I1 = Arrayturn(I1,rotation);
        for (int i=0; i<4;i++) {
            for (int j=0; j<4; j++) {
                if (I1[i][j]==1) {
                    I2[i][j] = new Block(Color.cyan,PosX+i*32,PosY+j*32,buene);
                }
                else {
                    I2[i][j] = new Block(Color.white,PosX,PosY,buene);
                    I2[i][j].setVisible(false);
                }
                buene.add(I2[i][j]);
                if(rotation>0)I1 = I10;
                buene.repaint();
                I2=I;
   
               
            }
        }
    }
    private int[][] Arrayturn (int arr[][], int Häufigkeit) {
        int[][] neuesArray = new int[arr[0].length][arr.length];
        for(int a=0;a<=Häufigkeit;a++) {
            for (int i = 0; i < neuesArray.length; i++) {
                for (int j = 0; j < neuesArray[0].length; j++) {
                    neuesArray[j][i] = arr[j][arr[j].length - i - 1];
                }
            }
          }
        if(Häufigkeit ==4) Häufigkeit = 0;
        return neuesArray;
    }
   
}

Main Metohde:
Java:
package Spiel;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import Figuren.I;
import Figuren.J;

import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.ActionEvent;

public class Main extends JFrame {
    public int rotation = 0;
    private JPanel ui;
    int c=0;
    int b=0;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                     frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 600, 600);
        ui = new JPanel();
        ui.setBorder(new EmptyBorder(5, 5, 5, 5));
        ui.setVisible(true);
        ui.setLayout(null);
        ui.requestFocus();

        setContentPane(ui);
       
       
        ui.setLayout(null);
       
        JButton btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            if(c==4)c=0;
            I a = new I (ui, 60, 60, c);
            c++;

            }
        });
        btnNewButton.setBounds(295, 179, 89, 48);
        ui.add(btnNewButton);
    }

}

Danke für eure Hilfe. PS: bin neu hier
 
Zuletzt bearbeitet:
Das sieht so merkwürdig aus, weil ich es erstmal schaffen möchte die Blöcke in der ui zum drehen zu bekommen und sie anzeigen zu lassen. Dann kann ich erst das runterfallen (natürlich ohne Knopfdruck) u.s.w. programmieren.
 
Merwürdig: Weil du Buttons für die Blöcke verwendest.
Normalerweise geht man nicht her und verändert mit jedem Schritt das Panel sondern zeichnet die Blöcke auf dieses, ohne ständig Komponenten hin und herzuschieben. Letzteres löst im Hintergrund einiges an Events aus und wird die Darstellung arschlangsam machen.

Als Datenmodell steht in einem 2D-Array, welche Felder gerade (gegebenenfalls: womit = Farbe, ja/nein tut's aber auch) belegt sind. der sich bewegende Block wird getrennt davon gespeichert.
In einer überschriebenen paintComponent Methode werden alle Blöcke des Grids + der bewegliche Block gezeichnet.

Wenn du einfach anfangen willst, fang mit der Zeichenmethode für ein Kästchen an, als Parameter gibt's den X und Y Index und eventuell noch die Farbe. Im zweiten Schritt zeichne das gesamte Datenmodell des Spielfelds.

Wenn du dich rein auf's Zeichnen konzentrierst, musst du dich nicht damit rumschlagen, was wo im Panel bereits vorhanden ist, deine gesamte Logik findet im Datenmodell statt anstatt im Panel.
 

Zurück
Oben