JMenuItem: how to install accelerators with 3 keys?

Please review the following code

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MenuActions extends JFrame { private JMenuBar jmb; private JMenu file; private JMenuItem open; public MenuActions() { jmb = new JMenuBar(); file = new JMenu("File"); open = new JMenuItem("Open"); open.addActionListener(new MenuAction()); open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,KeyEvent.VK_P,ActionEvent.CTRL_MASK)); file.add(open); jmb.add(file); this.setJMenuBar(jmb); getContentPane().add(new JPanel()); this.setSize(200,200); this.setVisible(true); this.validate(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private class MenuAction implements ActionListener { public void actionPerformed(ActionEvent ae) { JOptionPane.showMessageDialog(null,"OK"); } } public static void main(String[]args) { new MenuActions(); } } 

Here I need to run the EventHandler from JMenuItem when CTRL + O + P is pressed together, so the JOptionPane will display with the caption β€œOK”. But, as you can see, my attempt is giving an error! How can I do this when three of these keys are compressed together? Please, help!

+4
source share
2 answers

It seems that you are using the wrong version of the KeyStroke.getKeyStroke () method - you can’t even find one of the 3 parameters. Although, if you want, you can use CTL + ALT + P instead of CTL + O + P

Try using this version: http://docs.oracle.com/javase/7/docs/api/javax/swing/KeyStroke.html#getKeyStroke(java.lang.String )

like this: KeyStroke.getKeyStroke("control alt P")

Here is an example of this code:

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MenuActions extends JFrame { private JMenuBar jmb; private JMenu file; private JMenuItem open; public MenuActions() { jmb = new JMenuBar(); file = new JMenu("File"); open = new JMenuItem("Open"); open.setAction(new MenuAction("Open", null, "Click to Open an Existing File.", KeyStroke.getKeyStroke("control alt P"))); open.setAccelerator(KeyStroke.getKeyStroke("control alt P")); file.add(open); jmb.add(file); this.setJMenuBar(jmb); getContentPane().add(new JPanel()); this.setSize(200,200); this.setVisible(true); this.validate(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private class MenuAction extends AbstractAction { public MenuAction(String title, ImageIcon image , String toolTipText , KeyStroke acceleratorKey) { super(title, image); putValue(SHORT_DESCRIPTION, toolTipText); putValue(SHORT_DESCRIPTION, toolTipText); putValue(ACCELERATOR_KEY, acceleratorKey); } public void actionPerformed(ActionEvent ae) { JOptionPane.showMessageDialog(null,"OK"); } } public static void main(String[]args) { new MenuActions(); } } 
+3
source

to @Pete

you can combine any non_chars accelerators, but it’s not possible for keys in the range [az] && & & [0-9]

for the accelerator JMenu (Item) you can use

KeyEvent or Character.valueOf('char') for characters [az] && & & [0-9]

and as the second parameter

Event or ActionEvent or InputEvent , note that each of the APIs implements different keyboard maps

can combine KeyStroke, but with bitwise | or, but returns weird KeyStrokes

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.*; import javax.swing.border.BevelBorder; public class MenuExample extends JPanel { private static final long serialVersionUID = 1L; private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon"); private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon"); private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon"); private Icon questIcon = UIManager.getIcon("OptionPane.questionIcon"); private JTextPane pane; private JMenuBar menuBar; public MenuExample() { menuBar = new JMenuBar(); JMenu formatMenu = new JMenu("Justify"); formatMenu.setMnemonic('J'); MenuAction leftJustifyAction = new MenuAction("Left", errorIcon); MenuAction rightJustifyAction = new MenuAction("Right", infoIcon); MenuAction centerJustifyAction = new MenuAction("Center", warnIcon); MenuAction fullJustifyAction = new MenuAction("Full", questIcon); JMenuItem item; item = formatMenu.add(leftJustifyAction); item.setMnemonic('L'); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK)); item = formatMenu.add(rightJustifyAction); item.setMnemonic('R'); item.setAccelerator(KeyStroke.getKeyStroke(ActionEvent.CTRL_MASK | KeyEvent.VK_N, ActionEvent.CTRL_MASK & KeyEvent.VK_B));// CTRL +N item = formatMenu.add(centerJustifyAction); item.setMnemonic('C'); item.setAccelerator(KeyStroke.getKeyStroke(InputEvent.ALT_MASK | Character.valueOf('p'), InputEvent.ALT_MASK & Character.valueOf('o')));//ALT+F9 item = formatMenu.add(fullJustifyAction); item.setMnemonic('F'); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK | Event.SHIFT_MASK)); menuBar.add(formatMenu); menuBar.setBorder(new BevelBorder(BevelBorder.RAISED)); } class MenuAction extends AbstractAction { public MenuAction(String text, Icon icon) { super(text, icon); } public void actionPerformed(ActionEvent e) { try { pane.getStyledDocument().insertString(0, "Action [" + e.getActionCommand() + "] performed!\n", null); } catch (Exception ex) { ex.printStackTrace(); } } } public static void main(String s[]) { MenuExample example = new MenuExample(); example.pane = new JTextPane(); example.pane.setPreferredSize(new Dimension(250, 250)); example.pane.setBorder(new BevelBorder(BevelBorder.LOWERED)); JFrame frame = new JFrame("Menu Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setJMenuBar(example.menuBar); frame.getContentPane().add(example.pane, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } } 
+3
source

Source: https://habr.com/ru/post/1413325/


All Articles