JavaFX Daten aus Tabelle in ComboBox

Faru12

Mitglied
Hallo zusammen,

Ich bin auf der Suche nach der Lösung eines Problems:

Und zwar habe ich in SceneBuilder eine Tabelle erstellt, in die ich Daten eintragen kann. Das funktioniert bestens. Nun sollen die Daten aus einer Spalte automatisch in die Werteliste einer ComboBox kommen und von dort dann wieder in eine andere Tabelle. Nun stehe ich an, bei der Frage wie ich die Daten aus einer tableColumn in die ComboBox bekomme :bahnhof:. Kann mir da jemand helfen?

Vielen Dank!
 
Du hast ja eine ObservableList oder so, die die Daten enthält (auf der Tabelle: #getItems() oder so). Diese übergibst du der ComboBox. Musst dann nur die ValueFactory oder so ausbauen. Beispiele sollte es hier im Forum haben...
 
Hi,

um Daten aus der Tabelle zu hohlen:

Java:
public static void zeilenlesen() {

		int a = table.getSelectedRow();
		int b = table.getColumnCount();

		String[] zeilenwert = new String[b];
		
		for (int i = 0; i < b; i++) {

			zeilenwert[i] = ((String) table.getValueAt(a, i));
//			System.out.println(zeilenwert[i]);
		}

um das dann in ne ComboBox zu werfen:

Java:
for (int i = 0; i <= zeilenwert.length; i++) {
			comboBox.addItem(zeilenwert[i]));
			 }

So ungefähr sollte es klappen.

um aus ComboBox zu rufen: comboBox.getSelectedItem()

Gruß Grimnir
 
Ich glaube das ist genau das was ich suche.
Allerdings habe ich eine Frage und ein Problem. Zuerst zur Frage. Ich möchte ja nur eine bestimmte Spalte in die ComboBox übertragen, ist dies möglich?

Dann zu meinem Problem. Meine Tabelle (tableID) und meine ComboBox(heimTeam) geben jeweils einen Fehler aus, und zwar dass ich den Typ von tableID und heimTeam auf static ändern muss. Wenn ich dies tue, bekomme ich aber Fehler bei getSelectedRow und getColumnCount....


Java:
public static void zeilenlesen() {
 
        int a = tableID.getSelectedRow();
        int b = tableID.getColumnCount();
 
        String[] zeilenwert = new String[b];
        
        for (int i = 0; i < b; i++) {
 
            zeilenwert[i] = ((String) tableID.getValueAt(a, i));
//          System.out.println(zeilenwert[i]);
        }


Java:
for (int i = 0; i <= zeilenwert.length; i++) {
            heimTeam.addItem(zeilenwert[i]));
             }
 
Weis jetzt nicht wie dein Code aufgebaut ist.
Da die Methode aber statisch ist verlangt sie auch nach statische Variablen.
Nehm einfach mal das static aus der Methode.
So:
Java:
public void zeilenlesen()

Da kannst du ein wenig schmökern:
Galileo Computing :: Java ist auch eine Insel - 5 Eigene Klassen schreiben


ich möchte ja nur eine bestimmte Spalte in die ComboBox übertragen, ist dies möglich?

Natürlich sind auch bestimmte Zeilen/Spalten/Zelleninhalte möglich.

Glaub : getValueAt( rowIndex, columnIndex );

Die werte dann über geschachtelte Schleifen hohlen.
ungefähr so:
Java:
for (int i = 0; i < rowCnt; i++) {
				for (int j = 0; j < clmCnt; j++) {
        }
}


Das müsste Interessant für dich sein:
Galileo Computing :: Java ist auch eine Insel – 19.19 Tabellen (JTable)
 
Das Problem mit der Variante ist: du musst erst aus der Liste, die die Tabellendaten darstellt, Daten für die ComboBox extrahieren und dann wieder in eine Liste packen. Allein schonum speicher zu sparen verwende einfach die Items der Tabelle und passe deine Value und Cell Factories an... Alles andere ist eher kontraproduktiv (auch wenn es am Ende sicher auch zum ziel führen wird).
 
Kleines Beispiel, was ich meine...

Java:
	@FXML
	private ComboBox<ConnectionType> comboBoxConnType;

	@FXML
	public void initialize() {
		// connectionTypeItems ist eine ObservableList<ConnectionType> 
		// hier müsstest du so etwas machen wie table.getItemst()
		comboBoxConnType.setItems(connectionTypeItems);
		
		// mit dem werden deine Daten korrekt aus deinem Modell gewählt
		// hier kannst du die richtige "Spalte" wählen
		// also die Daten, die deine Tabelle in Spalte X darstellt  
		comboBoxConnType.setCellFactory(new ConnectionTypeCellFactory());
		
		// es kann sein, dass der Converter für dich sogar eher irrelevant ist...
		// ich weiss gerade selbst nicht mehr, wofür ich den brauchte :-D
		comboBoxConnType.setConverter(new ConnectionTypeStringConverter());

		// eye-candy
		if (comboBoxConnType.getItems().size() == 1) {
			comboBoxConnType.getSelectionModel().select(0);
		} else {
			comboBoxConnType.getSelectionModel().clearSelection();
		}
	}

	private final class ConnectionTypeCellFactory implements Callback<ListView<ConnectionType>, ListCell<ConnectionType>> {
		@Override
		public ListCell<ConnectionType> call(ListView<ConnectionType> param) {
			final ComboBoxListCell<ConnectionType> cell = new ComboBoxListCell<ConnectionType>() {
				
				{
					super.setPrefWidth(300);
				}
				
				@Override
				public void updateItem(ConnectionType item, boolean empty) {
					super.updateItem(item, empty);
					if (empty) {
						setText(null);
					} else {
						setTextOverrun(OverrunStyle.ELLIPSIS);
						setText(item.getText() != null && !item.getText().isEmpty() ? item.getText() : item.getId());
					}
				}
			};
			return cell;
		}
	}
	
	private final class ConnectionTypeStringConverter extends StringConverter<ConnectionType> {
		@Override
		public ConnectionType fromString(String string) {
			return null;
		}
		
		@Override
		public String toString(ConnectionType item) {
			return item.getText() != null && !item.getText().isEmpty() ? item.getText() : item.getId();
		}
	}
 

Zurück
Oben