java- Listener (CheckBox) wie auf Hintergrundfarbe des Fensters zurückgreifen?
Hi, also hier erstmal mein Code:
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, BorderLayout.SOUTH);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Nun meine CheckBox:
public class CheckBox extends JCheckBox {
public CheckBox(){
super("switch");
this.addItemListener(new CheckBoxListener(this));
}
}
nun mein Listener:
public class CheckBoxListener implements ActionListener {
JCheckBox j = new JCheckBox();
public CheckBoxListener(){
this.j = j;
}
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED){
//wie greife ich hier auf die hintergrundfarbe zurück?(zu dieser farbe |Color green = new Color(10, 100,20);|
}else{
//wie greife ich hier auf die hintergrundfarbe zurück?(zu dieser farbe |Color red = new Color(100, 30, 10);
}
}
}
Nun will ich, wenn der "haken" in der Checkbox gesetzt ist, dass sich die Hintergrundfarbe des Fenster ändert. Wie schaff ich dies? Ich hab schon ewig romprobiert komme aber nicht ganz drauf.
Gruß
|Natürlich geht das alles kompakter/einfacher, wills aber für eine bessere Übersicht und für mein Verständnis so machen ;)
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);
ich kann zum Beispiel auch in der Klasse CheckboxListener nicht auf mein Panel zurückgreifen. Sonst würde ich einfach southpanel.setBackground(color) machen.
ist es denn eine subclasse ?
vielleicht mal bei pastebin.com den ganzen code posten . und das repaint nicht vergessen .
Will eigentlich nur ein Programm schrieben, dass eine Checkbox hat, wenn ich einen Hacken setzte, die Hintergrundfarbe des ganzen Fenster ändert. Mehr nicht.
Ja genau, aber ich verstehe nicht warum ich meinem Listender nicht auf mein Frame zugreifen kann, bzw wie ich dies mach.