Problem with JavaFX ChangeListener?
I'm trying to teach myself JavaFX and have hit a snag. In the program
below I add a ChangeListener to a TextField. The Java8 method works
fine, adding an anonymous ChangeListener class works fine but I can't
create a class that implements ChangeListener and get it to compile.
The other question I have is why does the ObservableValue require a cast
to StringProperty in both of the working examples and why do I declare
it as <? extends String>?
Thanks,
knute...
import javafx.application.*;
import javafx.beans.*;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;
import java.time.*;
public class test99 extends Application {
public static void main(String... args) {
launch(args);
}
public void start(Stage primaryStage) {
primaryStage.setTitle("test99");
VBox root = new VBox(10);
Scene scene = new Scene(root,320,240);
TextField textField = new TextField();
textField.setOnAction(ae ->
System.out.println(textField.getText()));
textField.textProperty().addListener((observable,oldValue,newValue) -> {
((StringProperty)observable).setValue(newValue.toLowerCase());
});
/*
class LengthListener<String> implements ChangeListener<String> {
private final int length;
public LengthListener(int length) {
this.length = length;
}
@Override public void changed(
ObservableValue<? extends String> observable,
String oldValue,String newValue) {
if (newValue.length() > length)
((StringProperty)observable).setValue(
newValue.substring(0,length));
}
}
textField.textProperty().addListener(new LengthListener(4));
*/
textField.textProperty().addListener((observable,oldValue,newValue) -> {
((StringProperty)observable).setValue(newValue.length() > 4 ?
newValue.substring(0,4) : newValue);
});
/*
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String>
observable,
String oldValue,String newValue) {
((StringProperty)observable).setValue(newValue.length()
> 4 ?
newValue.substring(0,4) : newValue);
}
});
*/
textField.setText("Hello World!");
root.getChildren().add(textField);
primaryStage.setScene(scene);
primaryStage.show();
}
}
--
Knute Johnson