JCheckBox /-Abfrage der Selektion bei Veränderung-\

Stigma

Gesperrt
Guten Morgen


Kurz:
Wie registriere ich wenn meine JCheckBox verändert wurde. ich möchte gerne wissen mit welchem ActionCommand ist dies sehe. Dabei geht es mit nicht um die abfrage ob sie selektiert ist oder nicht! (jcb.isSelected()).

Lang:
Ich habe folgendes Problem:
Angenommen ich habe drei JComboBoxen, diese haben alle den gleichen addActionListener(eine einheitliche Klasse für alle). Nun drücke ich auf eine Box und gelange in diese Klasse. Folgendes Passiert. (anfangs ist keine selektiert!) Angenommen ich drücke auf die dritte Box. Die erste Abfrage wird else ergeben was dazu führt das else ausgeführt wird. "Will ich nicht schließlich hat sich nix dei der ersten Box verändert!". Bei der zweiten Abfrage das selbe! "Will ich auch nicht das dort ins else rein gesprungen wird!". Bei der dritten Abfrage wird in true rein gesprungen was ja auch gut ist.

Wenn ich nun eine weitere Box anklicke zB. die zweite, dann wird das erste else ausgeführt (nicht gut), dann das das zweite true (ok, gut, gewollt), dann das dritte true (nicht gut).
Java:
         if (jcb_01.isSelected()) {
            setBeispielON();
            
         } else {
            setBeispielOFF();
         }


         if (jcb_02.isSelected()) {
            setBeispielON();

         } else {
            setBeispielOFF();
         }

         
         if (jcb_03.isSelected()) {
            setBeispielON();

         } else {
            setBeispielOFF();
         }

Wie gesagt ich möchte nur in die schleife reinsprengen wenn sich etwas verändert hat, nicht wenn der Status gleichgeblieben ist!

Danke für eure Hilfe
 
Hallo,

du kannst beim Event abfragen, bei welcher Source das Event ausgelöst wurde(event.getSource()). Da kannst du dann mit equals vergleichen, um welche Checkbox es sich handelt.

Beispiel
Code:
if(e.getSource().equals(checkbox1) )
{
    if(checkbox1.isSelected()){
    }
    else
    {
    }
}


MFG

Sascha
 
BINGO!

So wie du es sagst habe ich das bei den Buttons gemacht. Warum bin ich nicht auf die Idee gekommen das auch bei den Boxen zu machen. Danke Sascha, obwohl ich nicht damit gerechnet hätte heute Nacht die Frage beantwortet zu bekommen.
 
Du solltest dir nur überlegen ob du solche Code wirklich schön findest. Ich finde es sehr unschön ein und denselben Listener für alle GUI-Elemente zu verwenden und dann mit getSource abzufragen um was es sich denn handelte.

Anonyme Klassen sind da irgendwie schöner, da ich die Logik sowieso nie in einem ActionListener unterbringen würde, sondern den nur dazu benutze das ganze an eine sinnvoll benamte Methode weiterzugeben.

Java:
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
      okButtonClicked();
}
});

Der Code ist so einfacher lesbar, denn wenn ich nach 2 Jahren wieder wissen möchte was passiert wenn der OK-Button geklickt wird, so brauch ich nur in diese eine Methode schauen.
 
Ok, man sollte nicht für eine ganze Anwendung einen ActionListener verwenden.

Ich würde allerdings auch nicht nur anonyme Klassen verwenden. Sowas wird meiner Meinung nach auch zu unübersichtlich bei großen GUIs.

Man kann die GUI sinnvoll einteilen und dann für jeden Teil einen ActionListener schreiben.

Beispiel:
Bei einem Dialog. Man hat unten 3 Buttons: Ok, Abbrechen und Übernehmen. Ich würde nicht für jeden Button einen eigenen ActionListener als anonyme Klasse schreiben, sondern einen ActionListener für alle 3 Buttons. Meiner Meinung nach ist es dann auch nicht unübersichtlicher und man hat weniger Objecte.

Das ist aber Geschmackssache wie man es letztendlich macht.


MFG

Sascha
 
Zeja so wie du es vorschlägst und wahrscheinlich auch überwiegend anwendest finde ich persönlich doof! Ich verwende den Konstruktor (wenn es um die GUI geht) allein für die Darstellung. Dort werden Swing Objekte initialisiert, verwendet, angezeigt. Dann habe ich eine innere Klasse. Diese Klasse heißt bei mir meist „Lauscher“. Sie ist für die Ereignisbehandlung zuständig. Wenn ich ganz viele Objekte habe (Buttons, Slider, usw.) dann lege ich auch mal ein ButtonLauscher an. Somit trenne ich die Funktion von der Grafik.

Ich finde das System sehr gut und vor allem übersichtlich, den somit habe ich nicht unnötige Stellen im Konstruktor. Ein paar Abfragen welcher Event nun getätigt worden ist kostet heutzutage nichts mehr.


Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Muster {

	// Globale Variablen 
	// ...
	
	public Muster() {
		// GUI
		// ...
	}

	public static void main(String[] args) {
		// void main
		// ...
	}

	private class Lauscher implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			// Event abfrage
			// ...
		}
	}
	
	//Sonstige Methoden
	// ...
	private void musterMethode(){
		
	}
}

So verbinde ich jedes mal das Objekt mit dem Lauscher. Diese Methode ist sehr Ressourcen schonend da nicht immer ein neues Objekt angelegt wird! Alle verwenden die gleiche innere Klasse.
Java:
Lauscher  lauscher = new Lauscher();
.addActionListener(lauscher);

Beispiel:
Bei einem Dialog. Man hat unten 3 Buttons: Ok, Abbrechen und Übernehmen. Ich würde nicht für jeden Button einen eigenen ActionListener als anonyme Klasse schreiben, sondern einen ActionListener für alle 3 Buttons. Meiner Meinung nach ist es dann auch nicht unübersichtlicher und man hat weniger Objecte.

Das ist aber Geschmackssache wie man es letztendlich macht.
Das Beispiel ist gut, selbst dort wende ich es so an. Ich finde diese Trennung wichtig! Aber wie du es sagst, Geschmackssache ist es auf jeden Fall!
 
Zuletzt bearbeitet:
Zurück