# Reaktion auf JCombobox Eintrag wechsel



## Jomama09 (10. Sep 2009)

Bei dieser Aufgabe sollte ich folgende Dinge umsetzen ,bzw an einer bestehenden Aufgabe ändern.  Im Original wurde der Rechenweg über Radiobutton ausgewählt und über berechnen gestartet.   
Die Auswahl sollte ich ändern und über JCombobox auslösen,die Box sollte über Array gefüllt werden, hab ich auch hinbekommen. Jetzt meine Probleme wäre Nett wenn mir jemand helfen könnte.

1. Ich soll in der Ereignisverarbeitung ermitteln welche Komponente das Ereignis ausgelöst hat. 
2. Die Rechenart die Ausgeführt wird soll soll diret über den Index der ausgewählten Rechenart in der Combobox erfolgen.

3. Sobald ein Eintrag in der JCombobox ausgewählt wird soll die Rechnung sofort ausgeführt werden, nicht mehr über den Button Rechnen ausgelösst werden.

Wäre echt Super wenn ich hilfe bekäme, mit den Listenern und Event Handling kann
ich leider noch nicht besonders.Hier mein Text zur Zeit


```
package Einsendeaufgabe10_2;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.JComboBox;

public class TaschenrechnerGUIV2 extends JFrame{

	//automatisch über Eclipse eingefügt
	private static final long serialVersionUID = 3006212012028893840L;
	
	//die Komponente
	//zwei Eingabefelder
	private JTextField eingabe1, eingabe2;
	//Array für die Combobox
	private String[] optionsAuswahl = {"addition", "subtraktion", "multiplikation", "division"};
	//zwei Schaltflächen
	private JButton schaltflaecheBerechnen, schaltflaecheBeenden;
	//ein Label für die Ausgabe
	private JLabel ausgabe;
	
	//die innere Klasse für die Ereignisverarbeitung
	class MeinListener implements ActionListener {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			//wurde auf Beenden geklickt?
			//dann das Programm beenden
			if (e.getActionCommand().equals("ende")) 
				System.exit(0);
			//wurde auf Berechnen geklickt?
			//dann eine Methode für die Berechnung aufrufen
			//und das Ergebnis anzeigen
			if (e.getActionCommand().equals("rechnen"))  
				ausgabe.setText(berechnen());
		}
	}
	
	//der Konstruktor
	public TaschenrechnerGUIV2(String titel) {
		
		super(titel);
		
		//insgesamt 4 Panels
		JPanel panelEinAus, panelBerechnungsCombo, panelButtons, gross;
		
		//die Panels über die Methoden erstellen
		panelEinAus = panelEinAusErzeugen();
		panelBerechnungsCombo = panelBerechnungsComboErzeugen();
		panelButtons = panelButtonErzeugen();
		
		//das Border-Layout benutzen
		//es ist Standard und muss nicht gesetzt werden
		
		//die Panels hinzufügen
		//die beiden größeren Panel fassen wir noch einmal zusammen
		gross = new JPanel();
		gross.add(panelEinAus);
		gross.add(panelBerechnungsCombo);
		//die beiden kommen in die Mitte
		add(gross,BorderLayout.CENTER);
		//das Panel mit den Buttons nach rechts
		add(panelButtons,BorderLayout.EAST);

		//die Standard-Aktion setzen
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//packen und anzeigen
		pack();
		setVisible(true);
		
		//Größenänderungen sind nicht zugelassen
		//damit das mühsam erstellte Layout nicht durcheinander kommt
		setResizable(false);
	}

	//die Methode erzeugt das Panel für die Ein- und Ausgabe
	//und liefert es zurück
	private JPanel panelBerechnungsComboErzeugen() {
		JPanel tempPanel = new JPanel();
		//es enthält die Eingabefelder mit beschreibendem Text und die Ausgabe
		//die Länge der Felder ist auf 10 Zeichen beschränkt
		
		//das Panel bekommt ein GridLaoyut mit 2 Spalten und etwas Abstand
		tempPanel.setLayout(new GridLayout(3,1));
		//ein beschreibendes Label für die erste Eingabe
		tempPanel.add(new JComboBox(optionsAuswahl));
		
		//einen Rahmen um das Panel ziehen
		tempPanel.setBorder(new TitledBorder("Operationen"));
		//das Panel zurückliefern
		return tempPanel;
	}
	
	private JPanel panelEinAusErzeugen() {
		JPanel tempPanel = new JPanel();
		//es enthält die Eingabefelder mit beschreibendem Text und die Ausgabe
		//die Länge der Felder ist auf 10 Zeichen beschränkt
		eingabe1 = new JTextField(10);
		eingabe2 = new JTextField(10);
		ausgabe = new JLabel("");
		
		//das Panel bekommt ein GridLaoyut mit 2 Spalten und etwas Abstand
		tempPanel.setLayout(new GridLayout(0,2,10,10));
		//ein beschreibendes Label für die erste Eingabe
		tempPanel.add(new JLabel("Zahl 1:"));
		//das erste Eingabefeld
		tempPanel.add(eingabe1);
		
		//und jetzt das zweite Eingabefeld
		tempPanel.add(new JLabel("Zahl 2: "));
		tempPanel.add(eingabe2);
		
		//und nun das Ausgabefeld für das Ergebnis
		tempPanel.add(new JLabel("Ergebnis: "));
		tempPanel.add(ausgabe);
		
		//einen Rahmen um das Panel ziehen
		tempPanel.setBorder(new TitledBorder("Ein- und Ausgabe"));
		//das Panel zurückliefern
		return tempPanel;
	}
	
	
	//die Methode erzeugt das Panel für die Schaltflächen
	//und liefert es zurück
	private JPanel panelButtonErzeugen() {
		JPanel tempPanel = new JPanel();
		
		schaltflaecheBeenden = new JButton(" Beenden ");
		//das Aktion-Command setzen
		schaltflaecheBeenden.setActionCommand("ende");
		schaltflaecheBerechnen = new JButton("Berechnen");
		schaltflaecheBerechnen.setActionCommand("rechnen");
		
		//Zwischenpanel für die Schaltflächen
		//ebenfalls ein GridLayout
		tempPanel.setLayout(new GridLayout(0,1));
		tempPanel.add(schaltflaecheBerechnen);
		//ein leeres Label einfügen
		tempPanel.add(new JLabel());
		tempPanel.add(schaltflaecheBeenden);
		
		//die Schaltflächen mit dem Listener verbinden
		MeinListener listener = new MeinListener();
		schaltflaecheBeenden.addActionListener(listener);
		schaltflaecheBerechnen.addActionListener(listener);
		
		tempPanel.setBorder(new TitledBorder("Funktionsbutton"));
		//das Panel zurückliefern
		return tempPanel;
	}
	
	//die Methode berechnet das Ergebnis und liefert es als 
	//Zeichenkette zurück
	private String berechnen() {
		//ergebnis muss initialisiert werden
		double zahl1, zahl2, ergebnis = 0;
		boolean fehlerFlag = false;
	
		//jetzt mit Fehlerbehandlung und Ausgabe der Meldung durch eine eigene Methode
		try {
			zahl1 = Double.parseDouble(eingabe1.getText());
		}
		catch (Exception NumberFormatException) {
			fehlermeldung(eingabe1);
			return ("Nicht definiert");
		}
		
		try {
			zahl2 = Double.parseDouble(eingabe2.getText());
		}
		catch (Exception NumberFormatException) {
			fehlermeldung(eingabe2);
			//das Ergebnis ist nicht definiert
			return ("Nicht definiert");
		}
		//welche Operation ist ausgewählt?
		//if (addition.isSelected())
			ergebnis = zahl1 + zahl2;
		//if (subtraktion.isSelected())
			ergebnis = zahl1 - zahl2;
		//if (multiplikation.isSelected())
			ergebnis = zahl1 * zahl2;
		//bei der Division überprüfen wir den zweiten Wert auf 0
		//if (division.isSelected()) {
			if (zahl2 != 0)
				ergebnis = zahl1 / zahl2;
			else 
				fehlerFlag = true;
		//}
		//wenn es keine Probleme gegeben hat, liefern wir das Ergebnis zurück
		if (fehlerFlag == false) {
			//die Formatvorgabe über die Klasse DecimalFormat
			DecimalFormat formatFolge = new DecimalFormat("0.##");
			//das Format anwenden, das Ergebnis ist eine Zeichenkette
			return (formatFolge.format(ergebnis));
		}
		else
			return ("Nicht definiert");
	}
	
	private void fehlermeldung(JTextField eingabefeld) {
		JOptionPane.showMessageDialog(this, "Ihre Eingabe ist nicht gültig","Eingabefehler", JOptionPane.ERROR_MESSAGE);
		eingabefeld.requestFocus();
	}
}
```


----------



## MathiasBauer (10. Sep 2009)

Wie wäre es mit einem ActionListener an deiner ComboBox?

Hier ein Link dazu:

GalileoComputing


----------



## Jomama09 (10. Sep 2009)

MathiasBauer hat gesagt.:


> Wie wäre es mit einem ActionListener an deiner ComboBox?
> 
> Danke für die Seite schaue ich mir morgen mal an .
> Hoffe das ich das dann mit dem Actionslistener hinbekomme.
> ...


----------

