Auf andere Objekte zugreifen

starbug

Erfahrenes Mitglied
Hallo,

ich habe ein Problem mit einer Aufgabe. Ich soll ein Panel erstellen was zwei Bereiche hat. Oben einfach nur ne Farbe und unten drei Buttons mit Farbnamen. Drückt man also z.B. auf Button "blau" soll der obere Bereich blau werden. Hier ist mal mein Code:

Java:
import java.awt.* ;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class MemoFrame extends JFrame   {
public static void main(String[] args)
{
MemoFrame derTest = new MemoFrame();
}
public MemoFrame()
{
super("Memo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(0,0);
setSize(450,450);
add(getMyPanel());
setVisible(true);
}
public JPanel getMyPanel(){
JButton[] Knoepfe = new JButton[3];
Knoepfe[0] = new JButton("Rot");
Knoepfe[0].addActionListener(
            new ActionListener() {
                    
                public void actionPerformed(ActionEvent e)
                {
                    if(e.getActionCommand().equals("Rot"))
                    {
                        System.out.println("Button Rot wurde gedrückt");
                        
                        Leinwand.setBackground(Color.red);
                               
                    }               }
});

Knoepfe[1] = new JButton("Grün");
Knoepfe[2] = new JButton("Blau");

JPanel Leinwand = new JPanel();
Leinwand.setBackground(Color.yellow);
Leinwand.setSize(150,150);

JPanel Flaeche = new JPanel();
Flaeche.setSize(this.getSize());
Flaeche.setLocation(0,0);
Flaeche.setLayout(new GridLayout(1,3));
for (Component c: Knoepfe) Flaeche.add(c);
Flaeche.add(Leinwand);

JPanel Bereich = new JPanel();
Bereich.setSize(300, 200);
Bereich.setLayout(new GridLayout(2,1));
Bereich.add(Leinwand);
Bereich.add(Flaeche);
return Bereich;

}
}

An der Stelle wo ich sage Leinwand.setBackground..... geht nix mehr weil ich nicht auf das Objekt zugreifen kann. Was kann man da machen?
Danke schonmal im vorraus.
 
Zuletzt bearbeitet:
Also mal abgesehen davon das du gegen jede Konvention gehst und nur CODE statt JAVA - Tags verwendest *was die Lesbarkeit einschränkt* fehlt die genaue Fehlermeldung. Weil so wie der Code an dieser Stelle ist solltest du eigentlich zugriff auf das Objekt haben ... es sei denn das du auf Grund der Konventions-Missachtung einen Konflikt zwischen Klasse und Objekt hast was dir der Compiler aber anzeigen sollte.

//EDIT
Es ist mir erst beim zweiten Mal aufgefallen ...
Welche Info gefehlt hat : das du das JPanel.setBackground(Color) im ActionListener meinst und nicht dierekt unter der Erzeugen dessen.
Natürlich kannst du innerhalb des ActionListener nicht darauf zugreifen weil du es an dem Punkt noch gar nicht deklariert hast. Außerdem müsste , wenn es dann an der richtigen Stelle stehen würde , das JPanel als final deklariert werden um den Zugriff von einer inneren Klasse zu ermöglichen.
Du könntest auch das JPanel in eine globale Variable packen und den ActionListener dierekt in deiner Klasse implementieren. So sparst du dir neben 3 anonymen inneren Klassen auch noch Code-duplizierung weil du alles nur einmal schreiben musst.
Auch stimmt die IF() nicht da du kein ActionCommand abfragen kannst wenn du dieses vorher nicht gesetzt hast.
 
Zuletzt bearbeitet von einem Moderator:
@JDev
THX ... das wusste ich noch nicht ... man lernt nie aus.

@starbug
Wer bitte hat dir denn diese Aufgabe gestellt ? Vermutlich jemand der nicht weis das du dann 3 mal den selben Code im Source stehen hast oder der sich nichts aus optimiertem Code macht ... rein produktiv gesehen würde man hier definitiv KEINE inneren Klassen verwenden weil es wie gesagt Code-duplizierung wäre.

Um die editierung deines Source möchte ich dich dennoch bitten damit er den Konventionen entspricht.
Ich lese ja nun schon länger deine Threads und habe festgestellt das du es scheinbar so schön falsch gleich vom ersten Tag an beigebracht bekommen hast. Google einfach mal nach "Java Code Conventions" und vielleicht gibst du diesen Tipp auch mal dem der es dir falsch beigebracht hat. Das sieht nämlich sehr Anfängerhaft aus.
 
Zurück