java- Listener (CheckBox) wie auf Hintergrundfarbe des Fensters zurückgreifen?


12.06.2022, 14:33

|Natürlich geht das alles kompakter/einfacher, wills aber für eine bessere Übersicht und für mein Verständnis so machen ;)


12.06.2022, 15:25

Hab jetzt mal die Fehler ausgebessert ;/ :

public class ActionEvent extends JFrame {

    public ActionEvent(){
        super ("ClickFrame");

        JPanel southPanel = new JPanel();
        CheckBox checkbox = new CheckBox();

        southPanel.add(new JLabel("switch"));
        southPanel.add(checkbox);

        this.add(southPanel);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        pack();
        setVisible(true);
    }

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

CheckBox:

public class CheckBox extends JCheckBox {

    public CheckBox(){

        this.addItemListener(new CheckBoxListener(this));
    }
}

Meine Listener:

public class CheckBoxListener implements ItemListener {

    CheckBox j;

    public CheckBoxListener(CheckBox j){
        this.j = j;
    }

    public void itemStateChanged(ItemEvent e){
        Color color;
        if(e.getStateChange() == ItemEvent.SELECTED){
             color = Color.RED;
             j.setBackground(color);
            //wie greife ich hier auf die hintergrundfarbe zurück?(zu dieser farbe |Color green = new Color(10, 100,20);|
        }else{
            color = Color.GREEN;
            j.setBackground(color);
            //wie greife ich hier auf die hintergrundfarbe zurück?(zu dieser farbe |Color red = new Color(100, 30, 10);
        }

    }

}

Jetzt fehlt mir wie gesagt, nurnoch wie ich jetzt die Hintergrundfarbe vom Frame ändere im Listener

2 Antworten

Um die Hintergrundfarbe des Frames zu ändern, müsstest du eine Instanz dessen Content Panes an den Listener weiterreichen. Eine Änderung der Farbe wäre bei deiner Anwendung allerdings nicht sichtbar, da das Panel (southPanel) bereits die volle Fläche des Fensters einnimmt. Daher wäre es sinnvoller, eine Referenz auf dieses Objekt weiterzutragen.

Im Listener ergänzt du ein Feld.

private JPanel parentContainer;

public CheckBoxListener(CheckBox checkbox, JComponent parentContainer) {
  // ...
  this.parentContainer = parentContainer;
}

In dem Zuge könntest du dem Feld für das CheckBox-Objekt eigentlich auch ruhig noch einen eindeutigen / aussagekräftigeren Namen spendieren. Das Gleiche gilt für den ersten Parameter des Konstruktors.

In itemStateChanged kannst du dann über das Feld die Hintergrundfarbe des Panels ändern.

parentContainer.setBackground(color);

Im Anschluss müsste noch der Konstruktor der CheckBox-Klasse erweitert werden:

public CheckBox(JComponent parentContainer) {
  this.addItemListener(new CheckBoxListener(this, parentContainer));
}

und in ActionEvent wäre natürlich ebenfalls eine Korrektur notwendig:

CheckBox checkbox = new CheckBox(southPanel);

frage2345707 
Fragesteller
 12.06.2022, 14:42

Ja genau, aber ich verstehe nicht warum ich meinem Listender nicht auf mein Frame zugreifen kann, bzw wie ich dies mach.

0
TechPech1984  12.06.2022, 14:43
@frage2345707

ist es denn eine subclasse ?

vielleicht mal bei pastebin.com den ganzen code posten . und das repaint nicht vergessen .

0
frage2345707 
Fragesteller
 12.06.2022, 14:45
@frage2345707

Will eigentlich nur ein Programm schrieben, dass eine Checkbox hat, wenn ich einen Hacken setzte, die Hintergrundfarbe des ganzen Fenster ändert. Mehr nicht.

0
frage2345707 
Fragesteller
 12.06.2022, 14:47

ich kann zum Beispiel auch in der Klasse CheckboxListener nicht auf mein Panel zurückgreifen. Sonst würde ich einfach southpanel.setBackground(color) machen.

0