我的JavaFX代码创建一个包含简单文本字段的阶段。该字段允许用户将文本拖放到其中,因此它可以解析text / html组件。
目前,文本字段和阶段是用Java代码创建的,但我想在Scene Builder中设计GUI。两个问题:
textfield
更改为textarea
以使其更大?我在Scene Builder中设计的其他阶段的创建方式如下:
FXMLLoader loader = new FXMLLoader(getClass().getResource("menu.fxml"));
Parent root = loader.load();
Controller controller = loader.getController();
Scene scene = new Scene(root, 420, 580);
controller.setPrimaryScene(scene);
scene.getStylesheets().add("styleMain.css");
primaryStage.setTitle("Demo");
primaryStage.setScene(scene);
primaryStage.show();
但我的Java代码使用DragEvent
和lambdas,所以我很困惑如何解决这个问题。事件处理程序代码是否保留在Java中,并且设计代码以某种方式传输到FXML?
public void start(Stage stage) throws Exception {
TextField textField = new TextField();
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(final ObservableValue<? extends String> observable, final String oldValue, final String newValue) {
htmlFound = newValue;
textFound = html2text(newValue);
}
});
textField.setPromptText("Drag data here");
textField.addEventHandler(
DragEvent.DRAG_OVER,
event -> {
if (event.getDragboard().hasHtml()) {
event.acceptTransferModes(TransferMode.COPY);
}
event.consume();
});
textField.addEventHandler(
DragEvent.DRAG_DROPPED,
event -> {
Dragboard dragboard = event.getDragboard();
if (event.getTransferMode() == TransferMode.COPY &&
dragboard.hasHtml()) {
textField.setText(dragboard.getHtml());
event.setDropCompleted(true);
}
event.consume();
});
StackPane stackPane = new StackPane(textField);
stackPane.setPadding(new Insets(5));
stage.setScene(new Scene(stackPane, 300, 150));
stage.setTitle("Drag and Drop");
stage.show();