2015-01-30 4 views
4

В моем приложении у меня есть экран, где я использую ускорители. Я использую функциональный ключ F3 для выполнения операции в своем приложении. Он отлично работает каждый раз, но когда я нажимаю на любом текстовом поле на этом экране, функциональный ключ не выполняется.JavaFX - Ускоритель не работает, когда текстовое поле имеет фокус

Вот код, где я поставил Accelerator:

scene.getAccelerators().put(
      new KeyCodeCombination(KeyCode.F3), 
      new Runnable() { 
       @Override 
       public void run() { 
        // do sth here 
       } 
      } 
    ); 

Когда я нажимаю мой текстовое поле, а затем нажмите функциональную клавишу F3 она не работает. Кто-то знает решение?

+0

См. Этот вопрос SO для получения лучшего ответа, который не требует изменения элемента управления: https://stackoverflow.com/questions/25397742/javafx-keyboard-event-shortcut-key – geometrikal

+0

кажется исправленным в fx9, что это ускорители (в меню и вручную установлены) работают, если textField сфокусирован – kleopatra

ответ

4

Это работает для меня с использованием Java 1.8.0_45. Однако я сталкиваюсь с аналогичной проблемой с редактируемым полем Combobox.

Отредактировано:

После дальнейшего исследования это, кажется, происходит с текстовым полем, а также. Я работал вокруг него, используя следующий пользовательский класс вместо текстового поля:

public class ShortcutFriendlyTextField extends TextField{ 

    public ShortcutFriendlyTextField() { 
     super(); 
     addEventHandler(KeyEvent.KEY_RELEASED,new EventHandler<KeyEvent>() { 

      @Override 
      public void handle(KeyEvent event) { 
       //handle shortcuts if defined 
       Runnable r=getScene().getAccelerators().get(new KeyCodeCombination(event.getCode())); 
       if(r!=null) { 
        r.run(); 
       } 
      } 
     }); 
    } 
} 
1

Этот ответ основан на tikerman-х годах. Я добавил код для обработки ключей-модификаторов.

if (!event.getCode().isModifierKey()) { 
    Consumer<KeyCombination.Modifier[]> runAccelerator = (modifiers) -> { 
     Runnable r = getScene().getAccelerators().get(new KeyCodeCombination(event.getCode(), modifiers)); 
     if (r != null) { 
      r.run(); 
     } 
    }; 

    List<KeyCombination.Modifier> modifiers = new ArrayList<>(); 
    if (event.isControlDown()) modifiers.add(KeyCodeCombination.CONTROL_DOWN); 
    if (event.isShiftDown()) modifiers.add(KeyCodeCombination.SHIFT_DOWN); 
    if (event.isAltDown()) modifiers.add(KeyCodeCombination.ALT_DOWN); 

    runAccelerator.apply(modifiers.toArray(new KeyCombination.Modifier[modifiers.size()])); 
} 

Редактировать: исправить потребительское правописание.

+0

Это выглядит интересно, но верно ли код? Кажется, что переменная 'modifier' используется до определения? Кроме того, какова цель кода? Даже с более простой версией мои ускорители с модификаторами, похоже, работают нормально (протестировано с помощью JavaFX 8). – Suma

+0

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

+0

@Suma Первая переменная 'modifier' является параметром лямбда-выражения. Другими словами, он локален для объекта runAccelerator. Он не относится к определению, которое определяется как «Список ». –

0

Если у вас установлены ускорители, где, например, MenuBar, используя некоторые другие решения, это приведет к тому, что ярлык будет выполнен дважды.

В моем случае использование модификаторов с помощью ярлыка (SHIFT + F3) работает во время фокусировки в текстовой области, но не при использовании только ускорителя, такого как только F3.

Я установил мой только для использования обработчика событий для ярлыков, которые не используют модификатор.

public static final double JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version")); 
public static void makeInputFieldShortCutFriendly(Node node) { 
    //this bug wasn't fixed until 9.0 
    if (JAVA_VERSION < 9) { 
     node.addEventHandler(KeyEvent.KEY_RELEASED, (KeyEvent event) -> { 
      if (!event.getCode().isModifierKey()) { 
       if (!event.isAltDown() && !event.isShiftDown() && !event.isAltDown()) { 
        Runnable r = node.getScene().getAccelerators().get(new KeyCodeCombination(event.getCode(), KeyCodeCombination.SHORTCUT_ANY)); 

        if (r != null) { 
         r.run(); 
        } 
       } 
      } 
     }); 
    } 
} 

Edit: Нет ярлыков модификаторов не был зафиксирован в Java 9. Учитывая популярность JDK 8 прямо сейчас, мы должны, вероятно, обеспечить обновление некоторых задом capatability или запроса пользователей есть JRE на 9+.

+1

проблема, кажется, исправлена ​​в fx9, то есть ускорители (в меню и вручную установлены) работают, если textField сфокусирован – kleopatra

+0

@ kleopatra хорошая точка. Я немного обновил свое решение. –

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

  • Нет связанных вопросов^_^