JLabel mit Bilder im nicht initialisierten JPanel hinzufügen

Bitte aktiviere JavaScript!
Ich versuche gerade ein Brettspiel zu programmieren. Damit die Spieler einen Character wählen können habe ich eine Characterwahl programmiert
(Siehe Bild unten).
Ich hab das Fenster in 3 Große JPanels aufgebaut (links,mitte,rechts) und am Ende mit einen BorderLayout zusammen gesetzt.
Mein Problem ist ich kann die Charaktere nicht zu den Spieler zuordnen. Der 1. Spieler soll auf einen der Bilder in der Mitte klicken und oben links bei ihn erscheinen.
Ich kann leider die einzelne JPanels nicht ansprechen, weil ich die mit einer schleife erstellt habe und gesetzt habe z. B. wenn ich versuche panel1 anzusprechen empfiehlt mir Eclipse die Variable zu erstellen.

Falls Ihr noch Informationen braucht, sagt bescheid.
Vielen Dank im Voraus!!!

Bild:

12326


Code:

Links:
Code:
    private String[] nameForPanels = { "Nothing", "playerOne", "playerTwo", "playerThree", "playerFour", "playerFive",
            "playerSix" };



 //Panel für die Spieler auf der linken Seite
        playerLeft = new JPanel();

        playerLeft.setLayout(new BoxLayout(playerLeft, BoxLayout.Y_AXIS));

        JPanel createLeftPanel;

        for (int i = 1; i <= nameForPanels.length - 1; i = i + 2) {

            createLeftPanel = new JPanel();

            String name = String.format("panel%d", i);
            // ich kann leider den JPanel nicht ansprechen z.B mit panel1.setVisible(false), sonst empfehlt mir die Eclipse die Variable zu erstellen
            createLeftPanel.setName(name);
       
            JLabel label = new JLabel();
            String name2 = String.format("labelLeft%d", i);
            label.setText("Player: " + i + "...");
            label.setName(name2);

            createLeftPanel.add(label);

            createLeftPanel.setPreferredSize(new Dimension(300, createLeftPanel.getHeight()));

            createLeftPanel.addMouseListener(new MouseListener() {

                @Override
                public void mouseReleased(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("Linker Panel");
                    
                     // der ActionListener ermittelt den richten Label, wenn meine Maus über den Label ist.
                    System.out.println("JPanel: " + label.getName());

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseClicked(MouseEvent e) {
                    // TODO Auto-generated method stub

                }
            });

            playerLeft.add(createLeftPanel);

Die Mitte:

Code:
        //Hintergrund wird gesetzt
        characterSelectionPanel = new SetBackgorund("img/table.jpg");

        GridLayout gridLayout = new GridLayout(ROWS, COULUMS, 30, 30);

        panelCenter = new JPanel(gridLayout);
        //damit man das Hintergrundbild sieht
        panelCenter.setOpaque(false);

        ImageIcon imageIcon;

        for (int i = 1; i <= CHARACTER; i++) {

            System.out.println("Schleife: " + i);

            panelForCharacterPicture = new JPanel();
            String name = String.format("panel%d", i);
            panelForCharacterPicture.setName(name);

            JLabel label = new JLabel();
            String name2 = String.format("label%d", i);
            label.setName(name2);


             // Das passende Foto wird ausgewählt
            imageIcon = getImage(i);

            label.setIcon(imageIcon);

            panelForCharacterPicture.add(label);

            panelForCharacterPicture.setOpaque(false);

            panelForCharacterPicture.addMouseListener(new MouseListener() {

                @Override
                public void mouseReleased(MouseEvent e) {

                }

                @Override
                public void mousePressed(MouseEvent e) {

                    if (actionListener) {
                          
                        System.out.println("Mouselistener From: " + label.getName());
                        System.out.println("ActionListener ist an");
                       //das "löschen" von den Bilder funktioniert
                        label.setVisible(false);

                    }
                }

                @Override
                public void mouseExited(MouseEvent e) {

                }

                @Override
                public void mouseEntered(MouseEvent e) {

                }

                @Override
                public void mouseClicked(MouseEvent e) {

                }
            });

            panelCenter.add(panelForCharacterPicture);

       }
Rechts:
Code:
     Das Gleiche wie bei links nur ohne Actionlistener, der wird später hinzugefügt

    private void createRightPanel() {
        System.out.println("Ich komme in die Methode");

        playerRight = new JPanel();

        playerRight.setLayout(new BoxLayout(playerRight, BoxLayout.Y_AXIS));

        JPanel createRightPanel;

        for (int i = 2; i <= nameForPanels.length - 1; i = i + 2) {

            createRightPanel = new JPanel();

            String name = String.format("panel%s", nameForPanels[i]);
            createRightPanel.setName(name);

            JLabel label = new JLabel();
            String name2 = String.format("labelLeft%d", i);
            label.setText("Player" + i + "...");
            label.setName(name2);

            createRightPanel.add(label);

            createRightPanel.setPreferredSize(new Dimension(300, createRightPanel.getHeight()));

            playerRight.add(createRightPanel);

        }
    }


Frame:
Und am Ende werden die alle hinzugefügt

Code:
frame.add(characterSelectionPanel, BorderLayout.CENTER);
        frame.add(playerLeft, BorderLayout.WEST);
        frame.add(playerRight, BorderLayout.EAST);
 
Wenn Du Panels erstellst, auf die Du später Zugriff brauchst: Dann speicher diese doch in Instanzvariablen! In diesem Fall könntest Du ein Array von Panels als Instanzvariable anlegen um dann bei der Erstellung das neue Panel eben in dem Array zu speichern.
 
Wenn Du Panels erstellst, auf die Du später Zugriff brauchst: Dann speicher diese doch in Instanzvariablen! In diesem Fall könntest Du ein Array von Panels als Instanzvariable anlegen um dann bei der Erstellung das neue Panel eben in dem Array zu speichern.
Vielen Dank für die Information:
Ich hab wie du schon gesagt hast ein Array von JPanels erstell und die dann im Array eingefügt.

Hier mein Code (Natürlich muss ich noch weiter programmieren bzw. anpassen)

Code:
public JPanel[][][] multiPanel = new JPanel[MAXCHARACTER / 2 + 1][MAXCHARACTER][MAXCHARACTER / 2 + 1];

    private int counterForMultiPanel;
Links:
Code:
    private void createLeftPanel() {

        System.out.println("Ich komme in die Methode");

        playerLeft = new JPanel();

        playerLeft.setLayout(new BoxLayout(playerLeft, BoxLayout.Y_AXIS));

        JPanel createLeftPanel;

        counterForMultiPanel = 1;

        for (int i = 1; i <= nameForPanels.length - 1; i = i + 2) {

            createLeftPanel = new JPanel();

            JLabel label = new JLabel();
            String name2 = String.format("labelLeft%d", i);
            label.setText("Player: " + i + "...");
            label.setName(name2);

            createLeftPanel.add(label);

            createLeftPanel.setPreferredSize(new Dimension(300, createLeftPanel.getHeight()));

            createLeftPanel.addMouseListener(new MouseListener() {

                @Override
                public void mouseReleased(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("Linker Panel");

                    System.out.println("JPanel: " + label.getName());

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseClicked(MouseEvent e) {
                    // TODO Auto-generated method stub

                }
            });

            multiPanel[counterForMultiPanel][0][0] = createLeftPanel;

            playerLeft.add(multiPanel[counterForMultiPanel][0][0]);

            counterForMultiPanel++;

        }

    }
Mitte:

private void createCharacterChoise() {

characterSelectionPanel = new SetBackgorund("img/table.jpg");

GridLayout gridLayout = new GridLayout(ROWS, COULUMS, 30, 30);

panelCenter = new JPanel(gridLayout);
panelCenter.setOpaque(false);

ImageIcon imageIcon;

for (int i = 1; i <= MAXCHARACTER; i++) {

System.out.println("Schleife: " + i);

panelForCharacterPicture = new JPanel();
String name = String.format("panel%d", i);
panelForCharacterPicture.setName(name);

JLabel label = new JLabel();
String name2 = String.format("label%d", i);
label.setName(name2);

System.out.println(name);

imageIcon = getImage(i, panelForCharacterPicture);

label.setIcon(imageIcon);

panelForCharacterPicture.add(label);

panelForCharacterPicture.setOpaque(false);

panelForCharacterPicture.addMouseListener(new MouseListener() {

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mousePressed(MouseEvent e) {

if (actionListener) {

System.out.println("Mouselistener From: " + label.getName());
System.out.println("ActionListener ist an");

multiPanel[1][0][0].add(label);

frame.repaint();

// label.setVisible(false);

}
}

@Override
public void mouseExited(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseClicked(MouseEvent e) {

}
});

panelCenter.add(panelForCharacterPicture);

}
 
Programmier das erst ohne GUI.
Das habe ich schon oft gehört, dass man ohne Gui programmieren muss, damit die Anwendung von der Gui unabhängig ist.
Ist das nicht komplizierter ohne GUI zu programmieren?
Wird das ganze Spiel ohne Gui programmiert oder Schrittweise z. B.
Characterwahl: logik->Gui und dann "das Spiel" -> logik -> Gui?
 
Ist das nicht komplizierter ohne GUI zu programmieren?
Es geht darum, Logik und Darstellung voneinander zu trennen. Das mag auf den ersten Blick komplizierter erscheinen, tatsächlich führt es aber zu einem saubereren Modell, bei dem die Verantwortlichkeiten klar geregelt sind und nicht zu einem fragilen Etwas, das man nur schief anzuschauen braucht, damit nichts mehr funktioniert :)

Wird das ganze Spiel ohne Gui programmiert oder Schrittweise z. B.
Characterwahl: logik->Gui und dann "das Spiel" -> logik -> Gui?
Wie oben geschrieben: es geht in erster Linie darum, Logik und Darstellung voneinander zu trennen. Wenn man keine Darstellung hat, wird man zu dieser Trennung gezwungen; es gibt ja keine andere Möglichkeit mehr. Du entwirfst ein Modell für Dein Spiel - ohne GUI - und das setzt Du um. Wenn Du das das erste mal machst, versuch es erstmal wirklich ganz ohne (G)UI; natürlich kannst Du Dir eine kleine Konsolengeschichte bauen, um Dein Modell zu testen.

In dem Zusammenhang: ein weiterer Vorteil dieser Trennung ist die Wiederverwendbarkeit. Ein Modell kann in automatisierten Tests verwendet (=getestet) werden. Wenn der Zustand des Spiels und das UI vermischt sind, werden solche Tests sehr schwierig. Abgesehen von Tests kannst Du Dir später überlegen, das Spiel auf JavaFX oder Android umzusetzen und musst dabei letztlich nur die Oberfläche tauschen.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben