Bonjour,

Je souhaite ajouter des raccourcis clavier sur des menus contextuel d'un arbre. Lorsque je renseigne l'attribut accelerator, je vois bien apparaître le raccourci dans mon menu et impossible d'appeler l'action associée en effectuant le raccourci.

J'ai testé sur un menu basique directement dans une scene et cela marche. Il semble que pour les menus contextuels des table et tree l'évènement keyPressed ne soit pas relayé aux Cell. Est-ce que quelqu'un a déjà réussi à les faire marcher?

Voici un exemple d'implémentation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class TreeViewShortCut extends Application {
 
  public class DnDCell extends TreeCell<Integer> {
 
    @Override
    protected void updateItem(Integer item, boolean empty) {
      super.updateItem(item, empty);
      String text = (item == null) ? null : item.toString();
      setText(text);
 
      ContextMenu menu = new ContextMenu();
 
      menu.getItems().add(MenuItemBuilder.create()
          .text("T_est")
          .accelerator((KeyCombination.keyCombination("Ctrl+A")))
          .mnemonicParsing(true)
          .onAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent e) {
              System.out.println("Ctrl A accelerator detected");
            }
          })
          .build());
      setContextMenu(menu);
 
    }
  }
 
  @Override
  public void start(Stage primaryStage) {
    TreeItem<Integer> treeRoot = new TreeItem(0);
    treeRoot.getChildren().add(new TreeItem(1));
    treeRoot.getChildren().add(new TreeItem(2));
    treeRoot.getChildren().add(new TreeItem(3));
    TreeView<Integer> treeView = TreeViewBuilder.<Integer>create().root(treeRoot).build();
    treeView.setCellFactory(new Callback<TreeView<Integer>, TreeCell<Integer>>() {
      @Override
      public TreeCell call(TreeView<Integer> param) {
        return new DnDCell();
      }
    });
 
    AnchorPane.setTopAnchor(treeView, 0d);
    AnchorPane.setRightAnchor(treeView, 0d);
    AnchorPane.setBottomAnchor(treeView, 0d);
    AnchorPane.setLeftAnchor(treeView, 0d);
    //
    AnchorPane root = AnchorPaneBuilder.create().children(treeView).build();
    Scene scene = new Scene(root, 300, 250);
    //
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
  }
 
  /**
   * The main() method is ignored in correctly deployed JavaFX 
   * application. main() serves only as fallback in case the 
   * application can not be launched through deployment artifacts,
   * e.g., in IDEs with limited FX support. NetBeans ignores main().
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
 
}
Merci

Edit:
Il semble que les accelerator ne marchent pas sur les menus contextuels en général. J'ai testé avec le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public class MenuExample extends Application {
 
  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
 
  @Override
  public void start(Stage primaryStage) {
    primaryStage.setTitle("java-buddy.blogspot.com");
    VBox root = new VBox();
    Scene scene = new Scene(root, 400, 300, Color.WHITE);
 
    //Top Menu Bar
    MenuBar menuBar = new MenuBar();
 
    Menu menu1 = new Menu("Menu");
 
    MenuItem menuItemA = new MenuItem("Item A");
    menuItemA.setAccelerator(KeyCombination.keyCombination("Ctrl+A"));
    menuItemA.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent e) {
        System.out.println("Item A Clicked");
      }
    });
 
    MenuItem menuItemB = new MenuItem("Item B");
    menuItemB.setAccelerator(KeyCombination.keyCombination("Ctrl+B"));
    menuItemB.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent e) {
        System.out.println("Item B Clicked");
      }
    });
 
    MenuItem menuItemC = new MenuItem("Item C");
    menuItemC.setAccelerator(KeyCombination.keyCombination("Ctrl+C"));
    menuItemC.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent e) {
        System.out.println("Item C Clicked");
      }
    });
 
    menu1.getItems().add(menuItemA);
    menu1.getItems().add(menuItemB);
    menu1.getItems().add(menuItemC);
    menuBar.getMenus().add(menu1);
 
    menuBar.prefWidthProperty().bind(primaryStage.widthProperty());
 
    Label label = new Label("My Text");
 
    ContextMenu ctxMenu = new ContextMenu();
 
    ctxMenu.getItems().add(MenuItemBuilder.create()
        .text("C_ontext")
        .accelerator((KeyCombination.keyCombination("Ctrl+E")))
        .mnemonicParsing(true)
        .onAction(new EventHandler<ActionEvent>() {
          @Override public void handle(ActionEvent e) {
            System.out.println("Context Clicked");
          }
        })
        .build());
 
    label.setContextMenu(ctxMenu);
 
    root.getChildren().addAll(menuBar, label);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
}
Edit2:
Je suis en jdk7u17