# JComboBox + ItemListener



## Jumanji (25. Feb 2015)

Hello liebe Community,

ich habe das Problem, dass der ItemListener in einer JComboBox iwie nicht will???:L


```
name.addActionListener(this);
```
  im Konstruktor

```
public void itemStateChanged(ItemEvent evt) 
	{
		if(evt.getSource().toString().equals("test"))
		{
			System.out.println("Test");
		}
	}
```

Ich habe im if-statement auch schon anderes versucht aber ohne erfolg

Was muss ich ändern bzw ändern damit es "Test" auf der Konsole ausgibt?

Danke im Vorraus


----------



## Harry Kane (25. Feb 2015)

Wenn du einen ItemListener brauchst, dann verwende auch einen und keinen ActionListener.


----------



## Jumanji (26. Feb 2015)

Okay das war nen bisschen dumm vonmir 

Funktioniert aber auch mit 
	
	
	
	





```
name.addItemListener(this);
```
 nicht


----------



## VfL_Freak (26. Feb 2015)

Moin,



Jumanji hat gesagt.:


> Funktioniert aber auch mit
> 
> 
> 
> ...


soll heißen ????? :bahnhof:


----------



## Jumanji (26. Feb 2015)

VfL_Freak hat gesagt.:


> Moin,
> 
> 
> soll heißen ????? :bahnhof:



Das ich Hilfe brauche. Ich krieg es nicht gebacken, dass das if-statement ausgeführt wird, egal wie ich es drehe und wende. Kann jemand den wurm finden?


----------



## VfL_Freak (26. Feb 2015)

Moin,

und was sollen wir jetzt ohne weitere Infos dazu sagen ??
Allenfalls, dass "evt.getSource().toString()" eben ungleich "test" ist ..... :noe:

Gruß KlAus


----------



## Harry Kane (26. Feb 2015)

Wenn der erwartete Output nicht erscheint, wird der entsprechende Codeblock offenbar nicht betreten. Dann besteht eine simple Debugging-Strategie darin, herauszufinden, an welcher Stelle der Code "steckenbleibt". Um das herauszufinden, könntest du ein System.out.println Statement in deinen Code einbauen, z. B. ein "System.out.println(evt.getSource().toString())" zu Beginn der itemStateChanged-Methode. Daran würdest du sehen, ob die Methode gar nicht erst betreten wird, oder der Stringvergleich fehlschlägt. Ich vermute mal sehr stark letzteres.


----------



## Jumanji (26. Feb 2015)

```
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class Main implements ItemListener
{
	private static String[] namen={" ", "test"};
	private static JFrame frm;
	private static JTextField i1,i2;
	private static JComboBox name=new JComboBox(namen);
	
	public Main()
	{
		name.addItemListener(this);
	}
	
	public static void setWerte()
	{
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		
		frm=new JFrame();
		i1=new JTextField(3);
		i2=new JTextField(3);
		
		frm.setSize(500, 400);
		frm.setLocation(dim.width/2-frm.getSize().width/2, dim.height/2-frm.getSize().height/2);
		frm.setLayout(null);
		frm.setVisible(true);
		frm.setDefaultCloseOperation(frm.EXIT_ON_CLOSE);
		
		name.setBounds(75, 50, 100, 20);
		i1.setBounds(50, 150, 50, 20);
		i2.setBounds(150, 150, 50, 20);
		
		frm.add(name);
		frm.add(i1);
		frm.add(i2);
		
		name.setVisible(true);
		i1.setVisible(true);
		i2.setVisible(true);
	}
	
	public static void main(String[]args)
	{
		setWerte();
	}

	public void itemStateChanged(ItemEvent evt) 
	{
		System.out.println("Test");
		if(evt.getSource().toString()=="test")
		{
			System.out.println("Test");
		}
	}
	
}
```

Also die itemStateChanged methode wird gar nicht erst betreten wenn ich in der Box test auswähle 
Ich sehe den fehler nicht


----------



## Harry Kane (26. Feb 2015)

Du addest im Konstruktor von Main die gerade entstehende Instanz von Main als ItemListener der JCheckBox. Nur erzeugst du in deinem Code gar keine Instanz von Main.
Schlechte Lösung: schreibe irgendwo in deiner setWerte-methode die Zeile " new Main()" hin.
Bessere Lösung:
1. entferne alle statics bis auf das in public static void main(String[]args).
2. verschiebe den Aufruf von setWerte in den Konstruktor von Main.
3. Ersetze in der public static void main den Aufruf von setWerte durch new Main().

Klar soweit?


----------



## Jumanji (26. Feb 2015)

Okay danke 

könntest du mir noch erklären warum es jetzt funktioniert damit sowas nicht nochmal vorkommt?


----------



## Harry Kane (27. Feb 2015)

In deiner Main-Klasse gibt es eine Methode public static void main(String[] args). Deshalb kannst du diese Klasse von der Kommandozeile oder von einer DIE aus laufen lassen. Die Java Laufzeitumgebung ruft dabei zunächst die o.g. public static void main Methode auf. In deinem Fall rufst du von der static main die ebenfalls statische Methode setWerte auf. In dieser Methode erzeugst du einen JFrame, füllst ihn mit Components und machst ihn sichtbar. So weit, so gut. Du rufst aber nie den Konstruktor der Klasse Main auf. Und nur im Konstruktor von Main wird der ItemListener geaddet!
Normalweise erzeugt man in der static main Methode eine Instanz der Klasse und macht damit ggf. irgendwas, z. B. ruft Instanzmethoden auf. Dieser Konstruktoraufruf passiert allerdings nicht automatisch, sondern muss explizit vom Benutzer programmiert werden.
Genauer kann ich es leider nicht erklären. Ich habe mich als blutiger Java Anfänger mit den Konzepten von Klassen und Instanzen bzw. statischen und nichtstatischen Methoden und Variablen auch etwas schwer getan. Aber als der Groschen dann gefallen war, war es auf einmal sonnenklar.


----------



## Jumanji (27. Feb 2015)

Ok danke 

Ich hab deinen Vorschlag umgesetzt, allerdings wird die methode jetzt 2 mal ausgeführt 

```
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class Main implements ItemListener
{
	private String[] namen={" ", "test"};
	private JFrame frm;
	private JTextField i1,i2;
	private JComboBox name=new JComboBox(namen);
	
	public Main()
	{
		name.addItemListener(this);
		
		setWerte();
	}
	
	public void setWerte()
	{
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		
		frm=new JFrame();
		i1=new JTextField(3);
		i2=new JTextField(3);
		
		frm.setSize(500, 400);
		frm.setLocation(dim.width/2-frm.getSize().width/2, dim.height/2-frm.getSize().height/2);
		frm.setLayout(null);
		frm.setVisible(true);
		frm.setDefaultCloseOperation(frm.EXIT_ON_CLOSE);
		
		name.setBounds(75, 50, 100, 20);
		i1.setBounds(50, 150, 50, 20);
		i2.setBounds(150, 150, 50, 20);
		
		frm.add(name);
		frm.add(i1);
		frm.add(i2);
		
		name.setVisible(true);
		i1.setVisible(true);
		i2.setVisible(true);
	}
	
	public static void main(String[]args)
	{
		new Main();
	}

	public void itemStateChanged(ItemEvent evt) 
	{
		if(name.getSelectedItem().toString()=="test")
		{
			System.out.println("Test");
		}
	}
	
}
```

Was ist denn jetzt falsch?

Ausgabe: Test
               Test


----------



## Harry Kane (28. Feb 2015)

Bei jeder "Betätigung" der JComboBox werden zwei Events erzeugt: einer  für  das deselektieren des alten, und einer für das selektieren des neuen Items. 
Ausserdem werden Strings mit equals verglichen.


----------

