JavaFx Combobox setzt keine Property

Ich habe nach dem Update auf JDK/JRE 8u66 das Problem, dass meine editierbare Combobox keine eingaben mehr speichert wenn sie den Fokus durch die Maus verliert.

...fillLevelComboBox.editableProperty().set(true);
}

private void addStringConverterToComboBox(final ComboBox<Integer> tFillLevelComboBox) {
        tFillLevelComboBox.setConverter(new StringConverter<Integer>() {
            @Override
            public String toString(Integer object) {
                return object + "%";
            }

            @Override
            public Integer fromString(String string) {
                Integer value = null;
                try {
                    value = Integer.parseInt(string);
                } catch (NumberFormatException ignored) {

                }
                if (string.matches("[0-9]+[%]")) {
                    value = Integer.parseInt(string.split("%")[0]);

                }
                if (value != null && !tFillLevelComboBox.getItems().contains(value)) {
                    tFillLevelComboBox.getItems().add(value);
                    tFillLevelComboBox.getItems().sort((o1, o2) -> o2.compareTo(o1));

                }
                if (value != null) {
                    return value;
                }

                return null;
            }
        });
    }

Der StringConverter wird überhaupt nicht aufgerufen. Ebenso der ChangeListener, der der selectionModelProperty hinzugefügt wurde.

Mit der zuvor installierten Version (JDK8u45) hat es funktioniert. Ist dies ein Bug oder hat sich etwas an der API geändert?

Habe leider nicht bei Google gefunden.

Gruß

ChrAu

Also das Model der CB im StringConverter zu ändern sieht für mich ziehmlich “strange” aus, ändert aber natürlich nichts an Deinem Problem.

kannst Du mal einen KSKB machen, der in u60 geht und in u66 nicht?

bye
TT

Also in u60 funktioniert es auch nicht. In u45 klappt es so wie es soll.
Verwendetes Betriebssystem Kubuntu 15.04

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("ComboBox!");
        ComboBox<Integer> comboBox = new ComboBox<>();
        for (int i = 100;
             i > 0;
             i = i - 10) {
            comboBox.getItems().add(i);
        }
        comboBox.editableProperty().set(true);

        Button btn = new Button("Combobox Value");
        btn.setOnAction(event -> System.out.println(comboBox.getSelectionModel().getSelectedItem()));
        StackPane root = new StackPane();
        VBox vBox = new VBox();
        vBox.getChildren().addAll(comboBox, btn);
        root.getChildren().addAll(vBox);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

Wenn in die ComboBox ein neuer Wert eingetragen wird, dieser NICHT mit ‘Enter’ bestätigt wird, sondern nur mit der Maus auf den Button geklickt wird, sollte der eingetragene Wert als selektiertes Element ausgewählt werden und auf der Konsole erscheinen. Dies klappt jedoch nicht mehr.

Schon mal danke.

Ist ein bekannter Bug
https://bugs.openjdk.java.net/browse/JDK-8138730

Danke, den Bugreport habe ich nicht gefunden.

Gibt es einen Workaround, um das Verhalten wieder zu erhalten, bis das Update erscheint?

Damit klapt es bei mir:

		ComboBox<Integer> comboBox = new ComboBox<>();
                comboBox.focusedProperty().addListener((obs, ov, nv) -> {
			if(!nv){
				KeyEvent keyEvent = new KeyEvent(KeyEvent.KEY_PRESSED, KeyCode.ENTER.impl_getChar(),
						KeyCode.ENTER.impl_getChar(), KeyCode.ENTER, false, false, false, false);
				comboBox.fireEvent(keyEvent);	
			}
		});

Kann man auch relativ elegant durch eine Hilfsmethode implementieren und einmal auf die Rootnode anwenden:

	public static void installFakeEnter(Node node){
		if(node instanceof ComboBox||node instanceof DatePicker){
			node.focusedProperty().addListener((obs, ov, nv) -> {
				if(!nv){
					KeyEvent keyEvent = new KeyEvent(KeyEvent.KEY_PRESSED, KeyCode.ENTER.impl_getChar(),
							KeyCode.ENTER.impl_getChar(), KeyCode.ENTER, false, false, false, false);
					node.fireEvent(keyEvent);	
				}
			});
		}else if(node instanceof Parent){
		Parent parent=(Parent)node;
		parent.getChildrenUnmodifiable().forEach(n->installFakeEnter(n));
		}
	}