# Taschenrechner mit ComboBox



## bandy (30. Jun 2010)

Hallo,

ich programmiere einen Taschenrechner und zwar soll er durch zwei "JTextField" Zahlen einlesen und dann durch gewuenschte Rechenoperation in der JComboBox, diese miteinander verrechnen und das Ergebnis in einem Label ausgeben. Hier mein Quelltext:



```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class JComboBoxx extends JFrame {
	private String[] rechenauswahl={"Addition", "Subtraktion", "Multiplikation", "Division"};//Liste fuer die ComboBox
	private JComboBox auswahl;
	
	private double zahl1, zahl2, ergebnis=0;
	private JLabel anzeige;
	private JTextField eingabe1, eingabe2;
	
	class InnereKlasse implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			Object ausloeser=e.getSource();
			zahl1 = Double.parseDouble(eingabe1.getText());
			zahl2 = Double.parseDouble(eingabe2.getText());
			if(ausloeser instanceof JComboBox){
				
				if(auswahl.getSelectedItem().toString().equals("Addition"))
					ergebnis=zahl1+zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Subtraktion"))
					ergebnis=zahl1-zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Multiplikation"))
					ergebnis=zahl1*zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Division"))
					ergebnis=zahl1/zahl2;
				
				
			}//Ende if-Abfrage
				
		}//Ende Methode
		
	}//Ende InnereKlasse

	//Konstruktor
	public JComboBoxx(String titel){
		super(titel);
		auswahl=new JComboBox(rechenauswahl);
		auswahl.setEnabled(false);
		anzeige=new JLabel(ergebnis);
		
	}
	
	
}
```


Leider gibt es Probleme beim Erstellen des Quelltextes, die Methode 
	
	
	
	





```
getSelectedItem()
```
wird schon rot unterstrichen und 
	
	
	
	





```
new JComboBox(rechenauswahl);
```
 sowie

```
anzeige=new JLabel(ergebnis);
```

Was ist falsch, wo liegt der Fehler?:bahnhof:


----------



## Gast2 (30. Jun 2010)

```
getSelectedItem()
```
Liefert dir ein Object zurück, da musst du zuerst nach String casten.


```
new JComboBox(rechenauswahl);
```
du hast JComboBox nicht importiert.


```
anzeige=new JLabel(ergebnis);
```
JLabel erwartet einen String. 
	
	
	
	





```
new JLabel(String.valueOf(ergebnis))
```
 sollte funktionieren.


----------



## bandy (30. Jun 2010)

EikeB hat gesagt.:


> ```
> getSelectedItem()
> ```
> Liefert dir ein Object zurück, da musst du zuerst nach String casten.
> ...



Also nun habe ich einige Aenderungen vorgenommen und der Taschenrechner rechnet, allerdings erscheint "ergebnis" nicht im Label "anzeige". Mit 
	
	
	
	





```
System.out.println(ergebnis);
```
 laesst sich jedoch ueberpruefen, dass ein Rechenvorgang statt findet nur wie gesagt nicht im Label angezeigt wird.

Hier nochmal der verbesserte Quelltext:


```
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JComboBox;



public class JComboBoxx extends JFrame {
	
	private static final long serialVersionUID = 1L;
	private String[] rechenauswahl={"Addition", "Subtraktion", "Multiplikation", "Division"};//Liste fuer die ComboBox
	private JComboBox auswahl;
	
	private double zahl1, zahl2, ergebnis;
	private JLabel anzeige;
	private JTextField eingabe1, eingabe2;
	
	class InnereKlasse implements ActionListener{
		
		@Override
		public void actionPerformed(ActionEvent e) {
			Object ausloeser=e.getSource();
			zahl1 = Double.parseDouble(eingabe1.getText());
			zahl2 = Double.parseDouble(eingabe2.getText());
			if(ausloeser instanceof JComboBox){
				
				if(auswahl.getSelectedItem().toString().equals("Addition"))
					ergebnis=zahl1+zahl2;
				
				
				if(auswahl.getSelectedItem().toString().equals("Subtraktion"))
					ergebnis=zahl1-zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Multiplikation"))
					ergebnis=zahl1*zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Division"))
					ergebnis=zahl1/zahl2; 
				
				
			}//Ende if-Abfrage
			System.out.println(ergebnis);
				
		}//Ende Methode
		
	}//Ende InnereKlasse

	//Konstruktor
	public JComboBoxx(String titel){
		super(titel);
		auswahl=new JComboBox(rechenauswahl);
		auswahl.setEnabled(true);
		
		InnereKlasse InnereKlasse = new InnereKlasse();
		auswahl.addActionListener( InnereKlasse);
		
		eingabe1 = new JTextField(10);
		eingabe2 = new JTextField(10);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		anzeige=new JLabel(String.valueOf(ergebnis));
		
		setLayout(new GridLayout(7,1,10,10));
		add(auswahl);
		
		add(new JLabel("Zahl1: "));
		add(eingabe1);
		add(new JLabel("Zahl2: "));
		add(eingabe2);
		add(new JLabel("Ergebnis: "));
		add(anzeige);
		
		
		
		setSize(300,300);
		setVisible(true);
	}
	
	
}
```

Wie kann ich nun es erreichen, dass "ergebnis" im Label angezeigt wird?:bahnhof:


----------



## eRaaaa (30. Jun 2010)

bandy hat gesagt.:


> Wie kann ich nun es erreichen, dass "ergebnis" im Label angezeigt wird?:bahnhof:




```
setText(..);
```
aufrufen?

[c]anzeige.setText(String.valueOf(ergebnis));[/c]
nach/anstelle von deinem System.out....


----------



## Final_Striker (30. Jun 2010)

Du musst das Ergebnis auch in das Label schreiben.

JLabel (Java 2 Platform SE v1.4.2)
label.setText(ergibnis);


----------



## bandy (1. Jul 2010)

Nun habe ich den Taschenrechner erweitert und zwar um die Container. Die beiden Eingabefelder und Ausgabe, habe ich in einen Container gesteckt, die JComboBox in den anderen Container und den Button in den dritten Container. Alle diese Container wiederum in einen Container "gross" gesteckt. Leider gibt es wieder ein Problem mit der Ausgabe im Label erscheint nichts und ich kann keinen Fehler entdecken



```
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.JPanel;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.border.TitledBorder;





public class JComboBoxx extends JFrame {
	
	private static final long serialVersionUID = 1L;
	private String[] rechenauswahl={"Addition", "Subtraktion", "Multiplikation", "Division"};//Liste fuer die ComboBox
	private JComboBox auswahl;
	private JButton schaltflaecheBeenden;
	
	private boolean fehlerFlag;
	private double zahl1, zahl2, ergebnis;
	private JLabel ausgabe;
	private JTextField eingabe1, eingabe2;
	
	class InnereKlasse implements ActionListener{
		
		@Override
		public void actionPerformed(ActionEvent e) {
			//wurde auf Beenden geklickt?
			//dann das Programm beenden
			if (e.getActionCommand().equals("ende")) {
				System.exit(0);}
			
			
			
			Object ausloeser=e.getSource();
			zahl1 = Double.parseDouble(eingabe1.getText());
			zahl2 = Double.parseDouble(eingabe2.getText());
			
			
			
			
			
			
			if(ausloeser instanceof JComboBox){
				
				if(auswahl.getSelectedItem().toString().equals("Addition"))
					ergebnis=zahl1+zahl2;
				
				
				if(auswahl.getSelectedItem().toString().equals("Subtraktion"))
					ergebnis=zahl1-zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Multiplikation"))
					ergebnis=zahl1*zahl2;
				
				if(auswahl.getSelectedItem().toString().equals("Division")){
					if(zahl2!=0)
					ergebnis=zahl1/zahl2; 
								
			}//Ende if-Abfrage
			System.out.println(ergebnis);
			ausgabe=new JLabel(String.valueOf(ergebnis));

			
			
				
		}//Ende Methode
		
		
		
	}//Ende InnereKlasse

	//Konstruktor
	public JComboBoxx(String titel){
		super(titel);
				
		JPanel panelEinAus, panelComboBox, panelButtons, gross;
		
		
		panelEinAus = panelEinAusErzeugen();
		panelComboBox = panelComboBoxErzeugen();
		panelButtons = panelButtonErzeugen();
		
		gross = new JPanel();
		gross.add(panelEinAus);
		gross.add(panelComboBox);
		add(gross,BorderLayout.CENTER);
		
	
		add(panelButtons, BorderLayout.EAST);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		pack();
		setVisible(true);
		
		setResizable(false);
	}

	

	private JPanel panelButtonErzeugen() {
		JPanel tempPanel = new JPanel();

		schaltflaecheBeenden = new JButton(" Beenden ");
		schaltflaecheBeenden.setActionCommand("ende");
		
		tempPanel.setLayout(new GridLayout(0,1,10,10));
		
		tempPanel.add(new JLabel());
		tempPanel.add(schaltflaecheBeenden);
		
		InnereKlasse InnereKlasse = new InnereKlasse ();
		schaltflaecheBeenden.addActionListener(InnereKlasse);
		
		return tempPanel;
	}
	

		private JPanel panelEinAusErzeugen() {
		JPanel tempPanel = new JPanel();
	
		eingabe1 = new JTextField(10);
		eingabe2 = new JTextField(10);
		ausgabe=new JLabel(String.valueOf(ergebnis));
		
		tempPanel.setLayout(new GridLayout(0,2,10,10));
		tempPanel.add(new JLabel("Zahl 1:"));
		
		tempPanel.add(eingabe1);
		
		tempPanel.add(new JLabel("Zahl 2: "));
		tempPanel.add(eingabe2);
		
		tempPanel.add(new JLabel("Ergebnis: "));
		tempPanel.add(ausgabe);
		
	
		
		
		
		tempPanel.setBorder(new TitledBorder("Ein- und Ausgabe"));
		
		return tempPanel;
	}
	
	
	
	
	private JPanel panelComboBoxErzeugen() {
		JPanel tempPanel = new JPanel();
		auswahl=new JComboBox(rechenauswahl);
		auswahl.setEnabled(true);
		
		InnereKlasse InnereKlasse = new InnereKlasse();
		auswahl.addActionListener( InnereKlasse);
		tempPanel.setLayout(new GridLayout(0,1,10,10));
		tempPanel.add(auswahl);
		
		tempPanel.setBorder(new TitledBorder("Operation: "));

		
		return tempPanel;
	}
	
	
	
}
```

Kann jemand den Fehler erkennen?:bahnhof:


----------



## eRaaaa (1. Jul 2010)

Hä?

[java=69]
 ausgabe=new JLabel(String.valueOf(ergebnis));
[/code]

a) wieso erstellst du ein neues Label
b) wenn dann müsstest du das natürlich auch dem Panel hinzufügen
c) wieso nicht einfach wie zuvor schon erwähnt den Text neu setzen?
[c]ausgabe.setText(String.valueOf(ergebnis));[/c]

*confused*

(p.s.: kann es auch sein dass du oft mit den Klammern durcheinander kommst?  )


----------



## bandy (1. Jul 2010)

eRaaaa hat gesagt.:


> Hä?
> 
> [java=69]
> ausgabe=new JLabel(String.valueOf(ergebnis));
> ...




So habe ich es auch probiert, ging aber nicht:noe: Entweder hatte ich irgendwo einen Fehler, oder es lag an Eclipse Aber Danke!:toll:


----------

