2016-10-22 1 views
1

enter image description hereвыберите узел по алфавиту при нажатии клавиш в JavaFX

По изображению есть 20 переключения buttons.I хочет изменить фокус обход при нажатии клавиши alphabetically.If я нажмите V с клавиатуры, то она будет выбирать первое вхождение (VVS1), если второй раз он выберет второе вхождение (VVS2).

ответ

1

Итерация по тумблеров, и если кто-то обнаружил, что содержит соответствующий текст, изменить выбранный переключатель к этому узлу:

private static Node[] fromStrings(ToggleGroup group, String... strings) { 
    Node[] result = new Node[strings.length]; 

    for (int i = 0; i < strings.length; i++) { 
     ToggleButton button = new ToggleButton(strings[i]); 
     button.setPrefSize(100, 50); 
     button.setTextAlignment(TextAlignment.CENTER); 
     button.setToggleGroup(group); 
     result[i] = button; 
    } 

    return result; 
} 

@Override 
public void start(Stage primaryStage) { 
    GridPane root = new GridPane(); 
    final ToggleGroup group = new ToggleGroup(); 
    root.addRow(0, fromStrings(group, "If", "VVS1", "VVS2", "VS1", "VS2", "SI1", "SI2", "SI2-", "SI3", "SI3-")); 
    root.addRow(1, fromStrings(group, "I1", "I1-", "I2", "I2-", "I3", "I4", "I5", "I6", "I7", "I8")); 

    root.setFocusTraversable(true); 
    root.setOnKeyTyped(new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent event) { 
      String s = event.getCharacter().toUpperCase(); 
      // move focus to the next matching element 
      if (s.length() == 1) { 
       event.consume(); 
       List<Toggle> toggles = group.getToggles(); 
       int selectedIndex = toggles.indexOf(group.getSelectedToggle()); 
       int size = toggles.size(); 

       // search next matching node starting directly after the 
       // selected position 
       for (int i = selectedIndex + 1; i < size; i++) { 
        Toggle l = toggles.get(i); 
        if (((Labeled)l).getText().toUpperCase().startsWith(s)) { 
         group.selectToggle(l); 
         return; 
        } 
       } 
       for (int i = 0; i < selectedIndex; i++) { 
        Toggle l = toggles.get(i); 
        if (((Labeled)l).getText().toUpperCase().startsWith(s)) { 
         group.selectToggle(l); 
         return; 
        } 
       } 
      } 
     } 
    }); 

    Scene scene = new Scene(root); 
    root.requestFocus(); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

Спасибо за ответ ... Это работает для меня ... – CTN

0

У меня есть ответ.

@FXML 
    private AnchorPane acnCalc; 
    @FXML 
    private ToggleGroup grpClarity; 
    @FXML 
     private ToggleButton tglIf, tglVvs1, tglvvs2, tglVs1, tglVs2, tglSi1, tglSi2, tglSi22, tglSi3, tglSi32, tglI1, 
       tglI12, tglI2, tglI22, tglI3, tglI4, tglI5, tglI6, tglI7, tglI8; 

Я уже установил группу переключений на все кнопки переключения с помощью строителя сцен.

public void initialize(URL location, ResourceBundle resources) { 
     HashMap<String, ToggleButton> lstCalc = new HashMap<>(); 
     for (Toggle t : grpClarity.getToggles()) { 
      ToggleButton chk = (ToggleButton) t; 
      lstCalc.put(chk.getText(), chk); 
     } 
     acnCalc.setOnKeyPressed(new EventHandler<KeyEvent>() { 
       @Override 
       public void handle(KeyEvent ke) { 
       if (ke.getCode().equals(KeyCode.I)) { 
         if (lstCalc.get("If").isFocused()) { 
          lstCalc.get("I1").requestFocus(); 
         } else if (lstCalc.get("I1").isFocused()) { 
         lstCalc.get("I1-").requestFocus(); 
        } else if (lstCalc.get("I1-").isFocused()) { 
         lstCalc.get("I2").requestFocus(); 
        } else if (lstCalc.get("I2").isFocused()) { 
         lstCalc.get("I2-").requestFocus(); 
        } else if (lstCalc.get("I2-").isFocused()) { 
         lstCalc.get("I3").requestFocus(); 
        } else if (lstCalc.get("I3").isFocused()) { 
         lstCalc.get("I4").requestFocus(); 
        } else if (lstCalc.get("I4").isFocused()) { 
         lstCalc.get("I5").requestFocus(); 
        } else if (lstCalc.get("I5").isFocused()) { 
         lstCalc.get("I6").requestFocus(); 
        } else if (lstCalc.get("I6").isFocused()) { 
         lstCalc.get("I7").requestFocus(); 
        } else if (lstCalc.get("I7").isFocused()) { 
         lstCalc.get("I8").requestFocus(); 
        } 
        else { 
         lstCalc.get("If").requestFocus(); 
        } 
       } 
       if (ke.getCode().equals(KeyCode.S)) { 
        if (lstCalc.get("SI1").isFocused()) { 
         lstCalc.get("SI2").requestFocus(); 
        } else if (lstCalc.get("SI2").isFocused()) { 
         lstCalc.get("SI2-").requestFocus(); 
        } else if (lstCalc.get("SI2-").isFocused()) { 
         lstCalc.get("SI3").requestFocus(); 
        } else if (lstCalc.get("SI3").isFocused()) { 
         lstCalc.get("SI3-").requestFocus(); 
        } 
        else { 
         lstCalc.get("SI1").requestFocus(); 
        } 
       } 
       if (ke.getCode().equals(KeyCode.V)) { 
        if (lstCalc.get("VVS1").isFocused()) { 
         lstCalc.get("VVS2").requestFocus(); 
        } else if (lstCalc.get("VVS2").isFocused()) { 
         lstCalc.get("VS1").requestFocus(); 
        } else if (lstCalc.get("VS1").isFocused()) { 
         lstCalc.get("VS2").requestFocus(); 
        } 
        else { 
         lstCalc.get("VVS1").requestFocus(); 
        } 
       } 
      } 
    } 
} 
+0

Это работает слишком, но другой вид логики .... – CTN

+1

И ответ работают..! –