Problem mit JOptionPane.

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

Code:
Object ob = i.getSource();
					JComboBox cb = (JComboBox)ob;
					int string_2 = cb.getSelectedIndex();
					if(string_2 != 0)
						{
							ta.setText("Sie haben : " + string_2 + " gewählt");
						}
					if(string_2 == 0)
												
						{
							JOptionPane.showMessageDialog(null, "Bitte eine Datei wählen");
						}	
						
					
						}
					}

Das Problem ist:

Wenn "JOptionPane.showMessageDialog(null, "Bitte eine Datei wählen");" erscheint, muss ich zweimal
hintereinander auf OK-Button klicken, damit es weg ist. Einmal angeklickt erschein es sofort wieder.

habt ihr vielleicht ein Idee??

Danke, chris
 
Eine Ergänzung:

Diese Box hat einen ItemListener angemeldet. Ich habe es jetzt mal mit einem ActionListener versucht
und da taucht dieses Problem nicht auf !?!?!

Code:
......
if(cb2.getSelectedIndex() == 0)
				{
					JOptionPane.showMessageDialog(null, "Bitte eine Datei wählen");
				}else
				{
					ta.setText("Sie haben : " + string_2 + " gewählt");
				}

hat jemand vielleicht eine Ahnung wieso?

Gruß chris
 
Es handelt sich hierbei um eine Hilfsklasse, aber gerne...

Code:
private class Action_4 implements ItemListener
		{
			public void itemStateChanged(ItemEvent i)
			{
				Object ob = i.getSource();
					JComboBox cb = (JComboBox)ob;
					int string_2 = cb.getSelectedIndex();
					if(string_2 != 0)
						{
							ta.setText("Sie haben : " + string_2 + " gewählt");
						}

					
					}
				}

Das ist auch schon alles.

Gruß chris
 
Anonymous hat gesagt.:
Das ist auch schon alles.
Und sagt vieles! Bei Wahl eines neuen Items aus einer ComboBox werden zwei ItemEvents gefeuert, nämlich erst für die Abwahl des alten Elements und dann für die Auswahl des neuen Elements. Ergänze die Methode um eine if-Abfrage, ob das ItemEvent fürs (wahrscheinlich) Anwählen gefeuert wurde. ItemEvent stellt dafür eine entsprechende Methode bereit.

Ark
 
Oh, wusste ich nicht, dass zwei Events gebildet werden. Ist das so ähnlich wie
bei dem FocusEvent (focusGained und focusLost)??

Danke Ark, ich werde es versuchen.

Gruß chris
 
Hi,

ich habe bis jetzt noch nicht mit SELECTED und DESELECTED gearbeitet. Aber ich habe
es mir mal so vorgestellt, hmm...

Code:
private class Action_4 implements ItemListener
		{
			public void itemStateChanged(ItemEvent i)
			{
				Object ob = i.getSource();
					JComboBox cb = (JComboBox)ob;
					int string_2 = cb.getSelectedIndex();
					int string_6 = i.getStateChange();
					if(string_2 != 0)
						{
							ta.setText("Sie haben : " + string_2 + " gewählt");
						}
					if(string_6 == ItemEvent.SELECTED && string_2 == 0)
					{
						JOptionPane.showMessageDialog(null, "Bitte eine Datei wählen");
						
					}
				}
		}

Es funktioniert zwar aber ich weiß nicht ob es zu umständlich ist !?!

Gruß chris
 
Dass
Code:
ta.setText("Sie haben : " + string_2 + " gewählt");
zweimal ausgeführt wird, ist dir aber schon bewusst, ja? 😉

Einfacher wird es wohl so:
Code:
private class Action_4 implements ItemListener
{
	public void itemStateChanged(ItemEvent i)
	{
		if(i.getStateChange() == ItemEvent.SELECTED)
		{
			int index = ((JComboBox)i.getSource()).getSelectedIndex();
			if(index != 0)
			{
				ta.setText("Sie haben : " + index + " gewählt");
			}
			else
			{
				JOptionPane.showMessageDialog(null, "Bitte eine Datei wählen");
			}
		}
	}
}
Noch einfacher wird es, wenn du, anstatt eigene Klassen für ItemListener anzulegen, diesen Listener direkt in der ComboBox implementierst. Etwa so (in einer neuen Datei):
Code:
public class SpezielleComboBox extends JComboBox implements ItemListener
{
	public SpezielleComboBox(){
		// Konstruktor-blabla, vor allem aber das hier:
		addItemListener(this); // oder wie das heißt; ich habe gerade die Dokumentation nicht zur Hand
	}
	public void itemStateChanged(ItemEvent i)
	{
		// Code ähnlich oben
	}
}
Der Vorteil dabei ist, dass i.getSource() immer this liefert, und damit spart man sich das Casten usw. Außerdem kann so ein Stück GUI-Code ausgelagert werden, sodass der Quelltext für die Hauptfensterklasse kürzer wird, da ja nur noch etwas der Art
Code:
beispielbox = new SpezielleComboBox();
add(beispielbox);
dort stehen muss.

Ark
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben