JavaFX Einfache FX Application, aber wie alte Features umgehen?

Bitte aktiviere JavaScript!
Hallo,
ich muss mir ein bisschen FX aneignen....
Also dachte ich als erste Gehversuche, erstelle ich mal eine einfach FX-Application mit einem TextField und einer ListView, in die sortiert alle Wörter eingetragen werden...
Code:
12330

Java:
package application;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;

public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			TextField f = new TextField();
			ListView<String> v = new ListView<String>();
			f.textProperty().addListener((observable, oldValue, newValue) -> {
				List<String> list = new ArrayList<String>(Arrays.asList(newValue.split("\\s+")));
				Collections.sort(list, Comparator.naturalOrder());
				v.setItems(FXCollections.observableArrayList(list));
				v.refresh();
			});

			VBox vb = new VBox();
			vb.getChildren().addAll(f, v);

			BorderPane root = new BorderPane();
			root.setCenter(vb);

			Scene scene = new Scene(root, 400, 400);
			// scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}
}

Aber besonders das split(), sort() und refresh() bereiten mir Bauchschmerzen. Das Arrays.asList() stammt ja noch aus Dinosaurierzeiten... Lässt sich das nicht irgendwie sehr geschickt einzeilig unter Beibehaltung der Semantik mit Streams und Lambdas umgehen? Welche Pitfalls habe ich noch übersehen?

Danke für Eure Verbesserungsvorschläge schonmal!
 
Wie sähe Dein Einzeiler aus? :)
Meinst Du sowas in der Art:
Code:
v.setItems(FXCollections.observableArrayList(Arrays.stream(newValue.split("\\s+")).sorted(Comparator.naturalOrder()).collect(Collectors.toList())));
Aber für wirklich lesbar halte ich das nicht mehr. Aber macht halt alles: Split vom String, dann als Stream sortieren um es dann zu wieder zu einer Liste zu machen ...
 
Code:
ObservableList<String> strings = FXCollections.observableArrayList();
TextField f = new TextField();
ListView<String> v = new ListView<>(new SortedList<>(strings, Comparator.naturalOrder()));
f.textProperty().addListener((observable, oldValue, newValue) -> strings.setAll(newValue.split("\\s+")));
 
Ja genau so etwas meinte ich. Hier wäre mein Vorschlag:
Java:
SortedSet<String> sss = new TreeSet<String>();

TextField f = new TextField();
ListView<String> v = new ListView<String>();
f.textProperty().addListener((observable, oldValue, newValue) -> {
	sss.addAll(Arrays.stream(newValue.split("\\s+")).collect(Collectors.toList()));
	v.setItems(FXCollections.observableArrayList(sss));
});
 
Perfekt(!), @mrBrown hat "gewonnen":
Java:
package application;

import java.util.Comparator;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.SortedList;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;

public class Main extends Application {
	@Override
	public void start(Stage primaryStage) {
		try {
			ObservableList<String> strings = FXCollections.observableArrayList();

			TextField f = new TextField();
			ListView<String> v = new ListView<>(new SortedList<>(strings, Comparator.naturalOrder()));
			f.textProperty().addListener((observable, oldValue, newValue) -> strings.setAll(newValue.split("\\s+")));

			VBox vb = new VBox();
			vb.getChildren().addAll(f, v);

			BorderPane root = new BorderPane();
			root.setCenter(vb);

			Scene scene = new Scene(root, 400, 400);
			// scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			primaryStage.setScene(scene);
			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}
}

Nun braucht man das nicht mehr:
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

Alleine wäre mir das nicht eingefallen...
 
Also ich finde, so ist noch ersichtlich, was eigentlich passiert (ein Trade-off):

Java:
ObservableList<String> stringList = FXCollections.observableArrayList();

TextField f = new TextField();
ListView<String> v = new ListView<>(new SortedList<>(stringList, Comparator.naturalOrder()));

f.textProperty().addListener((observable, oldValue, newValue) -> {
	final ArrayList<String> list = new ArrayList<>(Arrays.asList(newValue.split("\\s+")));
	stringList.setAll(list);
});

Und es ruckelt auch auch nicht oder so - und eine Scrollleiste ("Bildlaufleiste") wäre auch zu sehen...
 
Passende Stellenanzeigen aus deiner Region:

Oben