2014-11-10 3 views
0

В настоящее время у меня есть приложение, которое создаст текстовое поле, где пользователь нажимает. Однако я хочу, чтобы панель была доступна только для редактирования, когда определенное условие истинно. Тем не менее, область с кликами никогда не исчезает. Как я могу изменить это, чтобы область была доступна только для ссылок, если myAnchorPane.isVisible() это правда?Удаление EventListener

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 

    }); 

} 

EDIT:

Условием является

myAnchorPane.isVisible() 
+0

Я не понимаю отношения между чем-либо в вашем вопросе и заголовком вопроса. Какой прослушиватель событий вы хотите удалить? Кроме того, если я правильно понял вопрос, вы просто хотите, чтобы область текста редактировалась при определенных условиях. Трудно ответить на вопрос без дополнительной информации о том, что это за состояние. –

+1

Просто оберните код внутри вашего обработчика в условном выражении; таким образом он будет выполняться только тогда, когда условие истинно. Если вы хотите буквально удалить обработчик, когда логическое значение true, либо создайте метод setter, который вызывает 'removeEventHandler', когда значение установлено на false. –

+0

@VinceEmigh. Такое простое решение, я думаю, что попробую это. Я пробовал что-то подобное, но я завернул обработчик ENTIRE в выражении if, и он все еще всегда работал. Я попробую это, спасибо! – user2130057

ответ

1

Вы можете достичь этого приятно с ReactFX.

Вместо workspace.addEventHandler(MOUSE_CLICKED, ...), сделайте следующее:

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

Я вижу, вы используете RichTextFX, поэтому у вас уже есть ReactFX как зависимость в любом случае.

+0

Спасибо, я попробую! Я не знал о ReactFX. – user2130057

+1

@ user2130057 Принимая во внимание, что ваше условие - 'myAnchorPane.isVisible()', определите 'disabled' в приведенном выше коде как' myAnchorPane.visibleProperty(). Not() '. –

+1

Я включил это в ответ. –

Смежные вопросы