JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc.

Paz1

Mitglied
Hallo zusammen,
ich verstehe leider nicht so recht, wie ich einen wirklichen Nutzen aus einer ComboBox(o ä) ziehen kann.
Nach meinem Verständnis muss eine Combobox eigentlich meistens vom Typ String sein, da der Nutzer mit den Auswahlmöglichkeiten ja sonst wenig anfangen kann. Vermutlich steht als Auswahl meist der Name(String) der Instanz einer Klasse.
Mein Problem ist nun, dass ich jetzt zwar etwas mit Namen machen kann, aber ich will ja vor allem mit der Instanz (zu der dieser Name gehört) weiter arbeiten. Ich bekommen also die Verknüpfung nicht hin...
Vielen Dank schon mal für die Hilfe! Ich hoff ihr könnt verstehen, was ich meine xD

Gruß Paz1
 
Hallo, so:
Java:
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class MyBox extends JComboBox<String> {
	private HashMap<String, Object> map = new HashMap<String, Object>();

	public MyBox(Object[] options) {
		for (Object object : options) {
			this.addItem(object.toString());
			map.put(object.toString(), object);
		}
	}

	public Object getSelection() {
		return map.get(this.getSelectedItem().toString());
	}

	public static void main(String[] args) {
		JFrame f = new JFrame();
		MyBox b = new MyBox(new Object[] { "hallo", "Du", "da" });
		f.add(b);
		f.pack();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		b.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				if (e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println(b.getSelection().toString());
				}
			}
		});
	}
}

Anstatt "hallo", "Du", "da" packst du Objekte rein mit denen Du später was machen willst.
 
Hallo, Dankeschön erstmal, es funktionert akutell so, wie ich es mir vorstelle.
Ich habe allerdings erst mal gebraucht, um mich in einiges, für mich Neues, einzulesen (HashMap kannte ich noch gar nicht und den Unterschied zwischen ComboBox und JComboBox (und vergleichbarem) check ich immer noch nicht ganz...)

Habe einiges adaptiert und mein Code sieht jetzt so aus:
(Ist mein Übungsprojekt zum Lernen, ein Schafkopf-Rechner inkl. Stastik)

Java:
buttonNeuesSpiel.setOnAction(new EventHandler<ActionEvent>() {

	@Override
	public void handle(ActionEvent arg0) {
		VBox neuesSpiel = new VBox(10);
		Scene sceneNeuesSpiel = new Scene(neuesSpiel,800,800);
		primaryStage.setScene(sceneNeuesSpiel);
		primaryStage.show();	
					
		Button neuerSpieler = new Button("Neuen Spieler anlegen");
		Button hauptmenü = new Button ("Hauptmenü");
		Label mitspieler = new Label("Wer sitzt am Tisch?");
		Label amTisch = new Label("Es karteln:");
		Tisch tisch = new Tisch();
		StringProperty tisch1name = new SimpleStringProperty("");
		StringProperty tisch2name = new SimpleStringProperty("");
		StringProperty tisch3name = new SimpleStringProperty("");
		StringProperty tisch4name = new SimpleStringProperty("");
		Label tisch1 = new Label(tisch1name.get());
		Label tisch2 = new Label(tisch2name.get());
		Label tisch3 = new Label(tisch3name.get());
		Label tisch4 = new Label(tisch4name.get());
		Label warnung = new Label();
		warnung.setVisible(false);
					
		neuerSpieler.setOnAction(new EventHandler<ActionEvent>(){

			@Override
			public void handle(ActionEvent event) {
				new NeuerSpieler();							
			}						
		});
					
		ArrayList<Spieler> alleSpieler = new ArrayList<Spieler>();
		Spieler spieler1 = new Spieler("Name1");
		Spieler spieler2 = new Spieler("Name2");
		Spieler spieler3 = new Spieler("Name3");
		Spieler spieler4 = new Spieler("Name4");
					
		alleSpieler.add(spieler1);
		alleSpieler.add(spieler2);
		alleSpieler.add(spieler3);
		alleSpieler.add(spieler4);
					
		SpielerAuswahl cb1 = new SpielerAuswahl(alleSpieler);
		cb1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				tisch1.setText(cb1.getSelectionModel().getSelectedItem());
				tisch.setSpieler1(cb1.getSelection());
			}						
		});				

		hauptmenü.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				primaryStage.setScene(sceneStart);
				primaryStage.show();
			}
						
		});		
							
		neuesSpiel.getChildren().addAll(neuerSpieler, mitspieler, cb1, amTisch, tisch1, tisch2, tisch3, tisch4, warnung, hauptmenü);
										
	}
				
});

public class SpielerAuswahl extends ComboBox<String> {

	private HashMap<String, Spieler> map = new HashMap<String, Spieler>();
	
	public SpielerAuswahl(ArrayList<Spieler> spieler) {
		for(Spieler s  : spieler) {
			this.getItems().add(s.getName());
			map.put(s.getName(), s);
		}
	}
	
	public Spieler getSelection() {
		return map.get(this.getSelectionModel().getSelectedItem().toString());
	}

}
 
den Unterschied zwischen ComboBox und JComboBox (und vergleichbarem) check ich immer noch nicht ganz...)
Sein Beispiel ist für Swing, und nicht für JavaFX.

generell zu JavaFX: Eine Combobox kann beliebige Objekte als Typ haben, man muss ihr nur sagen, wie das jeweilige Objekt angezeigt werden soll.
Selber mit Maps oder Strings hantieren muss man da nicht.
 
Es gibt anscheinend noch eine andere (einfachere?) Möglichkeit, die ComboBox darzustellen!?
Könntet ihr mir auch erklären, wie ich sowas dann anwende? Ich finde weder bei ComboBox noch bei ComboBoxBase eine Möglichkeit, eine eigene Klasse zu verwenden, sodass nicht die Adresse der Klasse sondern ein Attribut der Klasse (in meinem Fall vom Typ String) im Dropdown-Menü angezeigt wird.
 
Die ComboBox hat eine Converter-Property, dort musst du nur toString passend überschreiben (fromString kannst du eine exception schmeißen lassen, wenn die ComboBox nicht editierbar sein soll.)
 

Neue Themen


Zurück
Oben