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 :
Merci
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); } }
Edit:
Il semble que les accelerator ne marchent pas sur les menus contextuels en général. J'ai testé avec le code suivant:
Edit2:
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(); } }
Je suis en jdk7u17
Partager