在SceneBuilder(FXML)中创建GUI而不是Java代码

时间:2016-01-02 19:14:58

标签: events javafx drag-and-drop fxml scenebuilder

我的JavaFX代码创建一个包含简单文本字段的阶段。该字段允许用户将文本拖放到其中,因此它可以解析text / html组件。

目前,文本字段和阶段是用Java代码创建的,但我想在Scene Builder中设计GUI。两个问题:

  1. 如何将Java代码转换为FXML?
  2. 如何将textfield更改为textarea以使其更大?
  3. 我在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();
    

0 个答案:

没有答案