Event Handling Listener spielt verrückt

llabusch

Mitglied
Liebe Java-Gemeinde,

Beim Programmieren eines Listeners für eine CheckBox bin ich am Verzweifeln...

Der Listener bekommt zwar natürlich die Änderungen an der Box mit, jedoch führt er einfach alle If-Zweige aus und wählt die CheckBox danach wieder ab! Das heißt nach einem Klick darauf bleibt der Haken nicht sichtbar, er wird einen Wimpernschlag eingesetzt, dann werden alle If-Zweige ausgeführt und dann ist er wieder verschwunden....

Entferne ich aber die Anweisungen im Listener, also:

Java:
@Override
		public void itemStateChanged(ItemEvent e){
	    
				if(e.getSource() instanceof JCheckBox){
				

				}
		}

Passiert beim Anwählen natürlich auch nichts, aber wenigstens bleibt der Haken drin!

Was kann das sein?

Hier mal das komplette Listing....


Danke schon mal! 🙂

Java:
package de.fernschulen.bildbetrachter;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

public class Bildbetrachter extends JFrame{
	
	//automatisch �ber Eclipse erg�nzt
	private static final long serialVersionUID = 5926848670766709720L;

	//f�r die Schaltfl�chen
	private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
	//f�r die Eingabe
	private JTextField eingabe;
	//f�r die Anzeige
	private BildPanel bildAnzeige, bildAnzeigeSchau;
	//f�r die Anpassung
	private JCheckBox skalieren;
	
	//die innere Klasse mit dem Listener
	class MeinListener implements ActionListener, ItemListener {									//Den Listener für die Checkbox mit einem ItemListener erweitern

		@Override
		public void actionPerformed(ActionEvent e) {
			//f�r die Schaltfl�chen zum Beenden
			if (e.getActionCommand().equals("Ende"))
				System.exit(0);
			//f�r die Auswahl eines einzelnen Bildes
			if (e.getActionCommand().equals("Laden")) 
				bildLaden();
			//f�r die Auswahl der Bilder f�r die Bilderschau
			if (e.getActionCommand().equals("LadenSchau")) 
				bilderSchau();
		}
		@Override
		public void itemStateChanged(ItemEvent e){
	    
				if(e.getSource() instanceof JCheckBox){
					
					if(skalieren.isSelected() == true){
						
						JOptionPane.showMessageDialog(null, "Gewählt");
					}
					else
					JOptionPane.showMessageDialog(null, "Nicht gewählt");
					
				}
		}
	}

	//der Konstruktor
	public Bildbetrachter(String titel) {
		super(titel);
		initGUI();
	}
	
	//die Methode zum Erstellen der Oberfl�che
	private void initGUI() {
		//die Panels f�r die Register
		JPanel registerEinzel =  new JPanel();
		JPanel registerSchau =  new JPanel();

		//das TabbedPane
		JTabbedPane panelKomplett =  new JTabbedPane();
		
		//das Register f�r die Einzelanzeige
		//eine neue Instanz f�r das Panel mit der Grafik erzeugen
		bildAnzeige = new BildPanel();
		
		//die Komponenten erstellen und einbauen
		registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
		registerEinzel.add(bildAnzeige);
		
		oeffnen = new JButton("Bild laden");
		beenden = new JButton("Beenden");
		oeffnen.setActionCommand("Laden");
		beenden.setActionCommand("Ende");
		eingabe = new JTextField(20);
		
		skalieren = new JCheckBox("Anpassen");
		
		registerEinzel.add(new JLabel("Bilddatei: "));
		registerEinzel.add(eingabe);
		registerEinzel.add(skalieren);
		registerEinzel.add(oeffnen);
		registerEinzel.add(beenden);
		
		//die Listener verbinden
		MeinListener listener = new MeinListener();
		oeffnen.addActionListener(listener);
		beenden.addActionListener(listener);
		skalieren.addItemListener(listener);																	//Die Checkbox mit dem Listener verbinden
		
		//das Register f�r die Bilderschau
		//eine neue Instanz f�r das Panel mit der Grafik erzeugen
		bildAnzeigeSchau = new BildPanel();
		
		//die Komponenten erstellen und einbauen
		registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
		registerSchau.add(bildAnzeigeSchau);
		
		oeffnenSchau = new JButton("Bilder laden");
		beendenSchau = new JButton("Beenden");
		oeffnenSchau.setActionCommand("LadenSchau");
		//die Schaltfl�che zum Beenden bekommt dasselbe ActionCommand wie im anderen Register
		beendenSchau.setActionCommand("Ende");
		
		registerSchau.add(oeffnenSchau);
		registerSchau.add(beendenSchau);
		
		//die Listener verbinden
		oeffnenSchau.addActionListener(listener);
		beendenSchau.addActionListener(listener);
		
		//und nun alles zusammenbauen
		
		panelKomplett.add("Einzelbild",registerEinzel);
		panelKomplett.add("Bilderschau",registerSchau);
		
		add(panelKomplett);
		
		//Gr��e setzen, anzeigen, keine Gr��en�nderungen zulassen und Standard-Verhalten festlegen
		setSize(350,450);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	

	//die Methode zum Laden eines Bildes �ber den Dialog
	private void bildLaden() {
		//einen Standard-�ffnen-Dialog erzeugen
		BildbetrachterDialog dialog = new BildbetrachterDialog();
		//die R�ckgabe holen
		String datei = dialog.dialogZeigen();
		//wenn eine Datei ausgew�hlt wurde, laden
		if (datei != null) {
			bildAnzeige.grafikLaden(datei, skalieren.isSelected());
			//den Namen der Datei im Eingabefeld anzeigen
			eingabe.setText(datei);
		}
	}
	
	//die Methode zur Anzeige der Bilderschau
	private void bilderSchau() {
		//einen Standard-�ffnen-Dialog erzeugen
		BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
		//die R�ckgabe holen und in einem Array vom Typ File ablegen 
		File[] dateien = dialogSchau.dialogZeigenMehrere();
		
		//wenn eine Datei ausgew�hlt wurde, alle Dateien nacheinander anzeigen
		if (dateien != null) {
			for (File datei: dateien) {
				bildAnzeigeSchau.grafikLaden(datei.toString(), true);
				//nach jeder Datei machen wir eine kurze Pause
				try {
					Thread.sleep(5000);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
 
Zuletzt bearbeitet:
Java:
   if(skalieren.isSelected() == true){
                       
                        JOptionPane.showMessageDialog(null, "Gewählt");
                    }
                    else
                    JOptionPane.showMessageDialog(null, "Nicht gewählt");

Da fehlen noch die Klammern fürs else.
Sonst ist ja das else nur für die eigene Zeile,
und das "nicht gewählt" fenster ein neuer, zweiter befehl.
 
Zuletzt bearbeitet:
Java:
   if(skalieren.isSelected() == true){
                       
                        JOptionPane.showMessageDialog(null, "Gewählt");
                    }
                    else
                    JOptionPane.showMessageDialog(null, "Nicht gewählt");

Da fehlen noch die Klammern fürs else.
Sonst ist ja das else nur für die eigene Zeile,
und das "nicht gewählt" fenster ein neuer, zweiter befehl.


Danke für die Antwort, aber auch das setzen der Klammern hat keine Verbesserung gebracht.... 🙁
 
ich hab die erfahrung gemacht, dass man checkboxen auch gut mit dem actionlistener verbinden kann,
Java:
@Override
        public void actionPerformed( ActionEvent e){
            if( e.getSource() instanceof JCheckBox){ //Prüfen, ob das auslösende Object eine Checkbox ist
                JCheckBox jcb =( JCheckBox)e.getSource();  //Objectreferenz an ein CheckBox Object übergeben
                if( jcb.isSelected() ==true){ //Prüfen, was der aktuelle Stattus des Object ist - Dieser Zweig prüft ob nach dem klick auf die CheckBox diese ausgewählt ist oder nicht
                    int anzahl =Integer.parseInt( durchlaeuferT.getText()) +1; //Das TextField auslesen und dem Zahlenwert um eins erhöhen
                    durchlaeuferT.setText( Integer.toString( anzahl)); //Dem TextField mit dem neuen Wert überschreiben
                } else{ //Wenn die Checkbox nach dem klick nicht mehr ausgewählt ist.
                    int anzahl =Integer.parseInt( durchlaeuferT.getText()) -1; //Das TextField auslesen und dem Zahlenwert um eins erhöhen
                    durchlaeuferT.setText( Integer.toString( anzahl)); //Dem TextField mit dem neuen Wert überschreiben
                }
            } else{}
        }
 
ich hab die erfahrung gemacht, dass man checkboxen auch gut mit dem actionlistener verbinden kann,
Java:
@Override
        public void actionPerformed( ActionEvent e){
            if( e.getSource() instanceof JCheckBox){ //Prüfen, ob das auslösende Object eine Checkbox ist
                JCheckBox jcb =( JCheckBox)e.getSource();  //Objectreferenz an ein CheckBox Object übergeben
                if( jcb.isSelected() ==true){ //Prüfen, was der aktuelle Stattus des Object ist - Dieser Zweig prüft ob nach dem klick auf die CheckBox diese ausgewählt ist oder nicht
                    int anzahl =Integer.parseInt( durchlaeuferT.getText()) +1; //Das TextField auslesen und dem Zahlenwert um eins erhöhen
                    durchlaeuferT.setText( Integer.toString( anzahl)); //Dem TextField mit dem neuen Wert überschreiben
                } else{ //Wenn die Checkbox nach dem klick nicht mehr ausgewählt ist.
                    int anzahl =Integer.parseInt( durchlaeuferT.getText()) -1; //Das TextField auslesen und dem Zahlenwert um eins erhöhen
                    durchlaeuferT.setText( Integer.toString( anzahl)); //Dem TextField mit dem neuen Wert überschreiben
                }
            } else{}
        }


Danke, mit dem ActionListener läuft alles prima!!! 🙂
 

Zurück
Oben