Как назначить два действия на нажатие одной клавиши в Java? - PullRequest
0 голосов
/ 17 января 2019

Я делаю приложение JavaFX и хочу назначить некоторые действия при нажатии клавиши. У меня есть KeyCode SHIFT, назначенный для действия, которое делает непрозрачность AnchorPane равным 1,0, и у меня KeyCode SLASH, назначенный для действия, которое устанавливает ту же непрозрачность AnchorPane равным 0,0.

Я хочу, чтобы клавиши рефакторинга и все действия были настроены на один код клавиши DEAD_TILDE.

Я хочу, чтобы нажатие клавиши на клавиатуре действовало как нажатие клавиши переключения. Когда я нажимаю клавишу DEAD_TILDE, непрозрачность AnchorPane должна быть установлена ​​равной 1,0, если я снова нажимаю ту же самую DEAD_TILDE, непрозрачность AnchorPane должна быть установлена ​​как 0,0

.

Как я могу это сделать?

Я пытался создать логическое значение и использовать его в методе. Но id не работает, или я просто сделал это неправильно:

@FXML  private AnchorPane mainAnchor, previewCard;

private boolean opacityCard = false;

@FXML
public void initialize(URL location, ResourceBundle resources) {

  showCardPreview();
}

private void showCardPreview() {

mainAnchor.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
  if (event.getCode() == KeyCode.DEAD_TILDE || !opacityCard) {
    opacityCard = false;
    previewCard.setOpacity(1.0);

    } else if(event.getCode() == KeyCode.DEAD_TILDE || true) {
    opacityCard = true;
    previewCard.setOpacity(0.0);
     }
  });
 }

Вот так я назначил два кода клавиш для двух действий:

 @FXML  private AnchorPane mainAnchor, previewCard;

 //key commands
  mainAnchor.setOnKeyPressed(event -> {
    switch (event.getCode()) {          

      case SHIFT:
        previewCard.setOpacity(1.0);
        break;

      case SLASH:
        previewCard.setOpacity(0.0);
        break;      
    }
  });
 }

EDIT:

Я пытался использовать это, но ничего не происходит:

  @FXML
  public void initialize(URL location, ResourceBundle resources) {

mainAnchor.setOnKeyPressed(event -> {
  if (event.getCode() == KeyCode.DEAD_TILDE) {
    previewCard.setOpacity(previewCard.getOpacity() == 0.0 ? 1.0 : 0.0);
    event.consume();
    }
  });

}

РЕДАКТИРОВАТЬ 2:

Я обнаружил, что в моем коде есть EventFilter, поэтому я просто рефакторил его так, и это испортилось! Я также изменил код ключа на DIGIT4, потому что знак DEAD_TILDA не работает

 //assign keys to some events
  mainAnchor.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
    if (event.getCode() == KeyCode.SPACE) {
      event.consume();
      flipCard();
    } else if (event.getCode() == KeyCode.DIGIT4) {
      event.consume();
      previewCard.setOpacity(previewCard.getOpacity() == 0.0 ? 1.0 : 0.0);
    }
  });

1 Ответ

0 голосов
/ 17 января 2019

В обработчике переключите состояние на основе текущего состояния. Другими словами, если непрозрачность равна 1.0, измените ее на 0.0 и наоборот.

mainAnchor.setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.DEAD_TILDE) {
        previewCard.setOpacity(previewCard.getOpacity() == 0.0 ? 1.0 : 0.0);
        event.consume();
    }
});

Поскольку вы переключаетесь между 0.0 и 1.0, вы можете рассмотреть возможность использования свойства visible.

mainAnchor.setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.DEAD_TILDE) {
        previewCard.setVisible(!previewCard.isVisible());
        event.consume();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...