JPanel per Name aufrufen

Witschi262

Grünschnabel
Hallo,
ich habe ein Spaltenlayout mit JPanels entworfen. Nun möchte ich aber eine Zelle per Methode umfärben. Über einen Eingangsparameter kann die Koordinate der Zelle eingegeben werden.

Die Koordinate der Zelle ist bereits der Name des JPanels. Gibt es eine elegantere Lösung, als alle JPanels über eine for() Schleife und panel.getName() == koordinate abzuklappern?

Hier mein Quellcode:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class SCHLANGENSPIEL extends JPanel
{
    private int rows = 10;
    private int width = 50;
    private int height = 50;
    private Dimension size = new Dimension(width, height);
    protected Color select_color = Color.blue;
    private JPanel selected_panel = null;
    private Color normal_color = null;
    private JFrame f;
    private JPanel panel;
    
    SCHLANGENSPIEL()
    {
        setLayout(new GridLayout(rows, rows, 1, 1));
        setBackground(Color.black);
        
        for(int i = 0; i < rows * rows; i++)
        {
            panel = new JPanel();
            String name = String.format("%d, %d", i / rows, i % rows);
            panel.setName(name);
            add(panel);
            System.out.println(name);
        }
        
    }
    
    public void begin() {
        f = new JFrame("Test");
        f.setVisible(true);
        f.setBounds(100, 100, 450, 300);
        f.add(new SCHLANGENSPIEL());
    }
    
    public void highlight()
    {

    }
   
}
 

youza

Erfahrenes Mitglied
Es gibt eine viel bessere Möglichkeit, wenn du die Panels als Array anlegst. Ich hab dir ein kleines Beispiel geschrieben und das Ganze auch gleich mal Ordentlich gekapselt:
Die Klasse Main ruft nur das Hauptfenster auf:

Java:
public class Main {
    public static void main(String[]args){
        new MainFrame();
    }
}

In Der Klasse MainFrame wird das Fenster erstellt und die Tastatur abgefragt:

Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class MainFrame extends JFrame implements KeyListener {
    /**
    * 
    */
    private static final long serialVersionUID = 8029805390388194836L;

    private int row = 5;
    private int column = 5;
    private SnakePanel snakePanel;

    public MainFrame() {
        snakePanel = new SnakePanel();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(300, 300);
        this.setLocationRelativeTo(null);
        this.add(snakePanel);
        this.setVisible(true);
        this.addKeyListener(this);
        snakePanel.highlight(row, column);
    }

    @Override
    public void keyPressed(KeyEvent event) {

    }

    @Override
    public void keyReleased(KeyEvent event) {
        if (event.getExtendedKeyCode() == 37) {
            if (column > 1)
                column--;
        } else if (event.getExtendedKeyCode() == 38) {
            if (row > 1)
                row--;
        } else if (event.getExtendedKeyCode() == 39) {
            if (column < 10)
                column++;
        } else if (event.getExtendedKeyCode() == 40) {
            if (row < 10)
                row++;
        }
        snakePanel.highlight(row, column);
    }

    @Override
    public void keyTyped(KeyEvent event) {

    }

}

Die Klasse SnakePanel enthält die Panels welche angezeigt werden mit der zugehörigen Highlight funktion:
Java:
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JPanel;

public class SnakePanel extends JPanel{
   
    /**
    * 
    */
    private static final long serialVersionUID = 6246406153042721453L;
   
    private int rows = 10;
    protected Color select_color = Color.blue;
    private JPanel[][] panels;
   
    public SnakePanel(){
        setLayout(new GridLayout(rows, rows, 1, 1));
        setBackground(Color.black);
        panels = new JPanel[rows][rows];
        for(int i = 0; i < rows; i++)
        {
            for (int j = 0; j < panels.length; j++) {
                panels[i][j] = new JPanel();
                this.add(panels[i][j]);
            }
        }
    }
    public void highlight(int row, int column)
    {
        //-1 Damit der Spalten und Zeilen Index bei 1 beginnt
        panels[row-1][column-1].setBackground(Color.BLACK);
    }
}

Ich hoffe das ist alles soweit verständlich. Achte bei der Namensgebung ein bisschen auf Konventionen SCHLANGENSPIEL ist ein schlechter Name für eine Klasse. Nur Konstanten werden durchweg groß geschrieben und meistens wird die Benennung in englischer Sprache vorgenommen.

Viele Grüße
Youza