java - 删除事件监听器

标签 java javafx

我目前有一个应用程序,它将在用户单击的任何地方创建一个文本区域。但是,我希望该 Pane 仅在特定条件成立时才可编辑。不过,可点击区域永远不会消失。如何更改此设置,以便仅当 myAnchorPane.isVisible() 为 true 时该区域才可单击?

double oldHeight = 0;
double oldWidth = 0;
@FXML
private void handleTextButton() {
    System.out.println("Text Clicked");
    TextHeaderTools.setVisible(false);
    BackgroundTools.setVisible(false);
    VideoTools.setVisible(false);
    PageTitleTools.setVisible(false);
    TemplateTools.setVisible(false);
    ImageTools.setVisible(false);
    TextTools.setVisible(true);


    workspace.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent me) {
            int x = (int) me.getX();
            int y = (int) me.getY();

            System.out.println("(" + x +", " + y +")");

            InlineCssTextArea newArea = new InlineCssTextArea();
            newArea.relocate(x, y);
            newArea.setStyle("-fx-background-color: transparent;");
            Text textHolder = new Text();
            newArea.setPrefSize(40,40);

            textHolder.textProperty().bind(newArea.textProperty());
            textHolder.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
                @Override
                public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) {
                    if (oldHeight != newValue.getHeight()) {
                        oldHeight = newValue.getHeight();
                        newArea.setPrefHeight(textHolder.getLayoutBounds().getHeight() + 30);
                    }
                    if (oldWidth != newValue.getWidth()){
                        oldWidth = newValue.getWidth();
                        newArea.setPrefWidth(textHolder.getLayoutBounds().getWidth() + 30); 
                    }
                }
            });             

            workspace.getChildren().addAll(newArea);


        } //end handle

    });

}

编辑:

条件是

myAnchorPane.isVisible()

最佳答案

您可以使用 ReactFX 很好地实现这一点.

不要使用 workspace.addEventHandler(MOUSE_CLICKED, ...),而是执行以下操作:

EventStreams.eventsOf(workspace, MOUSE_CLICKED)
        .suppressWhen(myAnchorPane.visibleProperty().not())
        .subscribe((MouseEvent me) -> {
            // handle mouse click
        });

我看到您使用 RichTextFX,因此您已经将 ReactFX 作为依赖项了。

关于java - 删除事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849829/

相关文章:

java - 为什么用 JUnit 进行单元测试的类不能有主类?

java - 很难选择...... IO vs NIO

java - 路径如何在 Java 部署的 REST Web 服务中工作?

java - 使用单独的类时 findViewById() 不起作用

JavaFX 应用程序卡住,我不知道为什么

java - 将文件中的值设置为组合框

java - 如何修复我的计算器 java 程序

JavaFX ScrollPane 更新滚动时的 viewportBounds

java程序将数字转换为字符串

java - 将属性绑定(bind)到从 JavaFx/TornadoFX 控件派生的值的正确方法