How to Add a Shortcut Key for a Jbutton in Java

How to add a shortcut key for a jbutton in java?

You need to create an Action to be used by the button. Then the Action can be used by the ActionListener and you can bind the Action to a KeyStroke.

Read the Swing tutorial. There are sections on:

  1. How to Use Actions
  2. How to Use Key Bindings

For example:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class CalculatorPanel extends JPanel
{
private JTextField display;

public CalculatorPanel()
{
Action numberAction = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
// display.setCaretPosition( display.getDocument().getLength() );
display.replaceSelection(e.getActionCommand());
}
};

setLayout( new BorderLayout() );

display = new JTextField();
display.setEditable( false );
display.setHorizontalAlignment(JTextField.RIGHT);
add(display, BorderLayout.NORTH);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout(0, 5) );
add(buttonPanel, BorderLayout.CENTER);

for (int i = 0; i < 10; i++)
{
String text = String.valueOf(i);
JButton button = new JButton( text );
button.addActionListener( numberAction );
button.setBorder( new LineBorder(Color.BLACK) );
button.setPreferredSize( new Dimension(30, 30) );
buttonPanel.add( button );

InputMap inputMap = buttonPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(text), text);
inputMap.put(KeyStroke.getKeyStroke("NUMPAD" + text), text);
buttonPanel.getActionMap().put(text, numberAction);
}
}

private static void createAndShowUI()
{
JFrame frame = new JFrame("Calculator Panel");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new CalculatorPanel() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible(true);
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

Keystroke/Hot Key for JButton in Java

To get your key bindings to work, use a KeyEvent.CTRL_DOWN_MASK not the KeyEvent.CTRL_MASK.

Myself, I prefer to use AbstractActions over ActionListeners, since this way menus and buttons can share the same Actions, and the Actions can have their own mnemonic key, although this needs to be an alt-key combination. For example:

import java.awt.Component;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class ShowMyDialogTest {

private static void createAndShowGui() {
JFrame frame = new JFrame("Show MyDialog Test");

JPanel mainPanel = new JPanel();
Action showAction = new ShowDialogAction(frame, "Show Dialog");
final JButton showDialogBtn = new JButton(showAction);
mainPanel.add(showDialogBtn);
mainPanel.setPreferredSize(new Dimension(600, 400));

KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_DOWN_MASK);
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = showDialogBtn.getInputMap(condition);
ActionMap actionMap = showDialogBtn.getActionMap();
inputMap.put(keyStroke, keyStroke.toString());
actionMap.put(keyStroke.toString(), new AbstractAction() {

@Override
public void actionPerformed(ActionEvent arg0) {
showDialogBtn.doClick();
}
});

JMenuItem showMenuItem = new JMenuItem(showAction);
JMenuItem exitMenuItem = new JMenuItem(new DisposeAction("Exit", KeyEvent.VK_X));
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
fileMenu.add(showMenuItem);
fileMenu.add(exitMenuItem);

JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

class ShowDialogAction extends AbstractAction {
private JFrame frame;
private ShowDialogPanel dialogPanel;
private JDialog dialog;

public ShowDialogAction(JFrame frame, String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
this.frame = frame;
}

@Override
public void actionPerformed(ActionEvent e) {
if (dialogPanel == null) {
dialogPanel = new ShowDialogPanel();
}
if (dialog == null) {
dialog = new JDialog(frame, "My Dialog", ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(dialogPanel);
dialog.pack();
}
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
// TODO add any code that extracts data from dialogPanel

}
}

class ShowDialogPanel extends JPanel {
private JButton button = new JButton(new DisposeAction("Close", KeyEvent.VK_C));

public ShowDialogPanel() {
add(button);
}
}

class DisposeAction extends AbstractAction {
private static final long serialVersionUID = 1L;

public DisposeAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}

@Override
public void actionPerformed(ActionEvent e) {
Component component = (Component) e.getSource();
Window win = SwingUtilities.getWindowAncestor(component);
if (win == null) {
JPopupMenu popup = (JPopupMenu) component.getParent();
if (popup == null) {
return;
}
component = popup.getInvoker();
win = SwingUtilities.getWindowAncestor(component);
}
win.dispose();
}
}

Create a keyboard shortcut for a button

I don't know what is the exact problem because you provide too few code. However, you can't use getSource() to test which key is typed (pressed, or released). Use getKeyChar() and getKeyCode().


The following is explanation of my code:

  1. You need to add a KeyListener to a component(of course)
  2. The component must have focus
    1. The component must be focusable (set focusable to true)
    2. The component need to request for focus
  3. Override keyTyped keyPressed or keyReleased to retrieve KeyEvent
    1. To check which key is typed in keyTyped, use getKeyChar()
    2. To check which key is pressed or released in keyPressed and keyReleased, use getKeyCode()

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(new Dimension(410, 330));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBackground(Color.GREEN);
panel.setBounds(50, 50, 300, 200);

panel.addKeyListener(new MyKeyListener()); // add KeyListener
panel.setFocusable(true); // set focusable to true
panel.requestFocusInWindow(); // request focus

f.getContentPane().add(panel);
f.setVisible(true);
}

static class MyKeyListener extends KeyAdapter {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == '\177') {
// delete row method (when "delete" is typed)
System.out.println("Key \"Delete\" Typed");
}
}

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
// delete row method (when "delete" is pressed)
System.out.println("Key \"Delete\" Pressed");
}
}

@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
// delete row method (when "delete" is released)
System.out.println("Key \"Delete\" Released");
}
}
}
}

Java - How to apply a keyboard shortcut of 3 keys for a JButton?

Then use the following key stroke:

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
KeyEvent.SHIFT_MASK | KeyEvent.CTRL_MASK)

Hotkey/Shortcut for JButton

I had the same issue: I have a form an whenever I am edditing a field I want to press enter for it to fire the actionPerformed event.

I fixed it with this:
The JPanel the button and the rest of the form is located on is called content:
content.getRootPane().setDefaultButton(enterButton);

This keeps the button always selected so when you press enter, its corresponding actionPerformed event fires (remember to add an ActionListener to it!)

Hope this helps you!

Kind regards,

Héctor

Shortcut key for jButton without using alt key

Yes, Swing was designed to use Key Bindings. So instead of adding an ActionListener to the button you add an Action. Then that Action can be shared by the button or a menu item. You can also assign any number of KeyStrokes to invoke the Action by using the KeyBindings. The tutorial also has a section on Actions which explains why using an Action is beneficial.

JComponent has a registerKeyboardAction(...) method which basically does the InputMap/ActionMap bindings for you, but it also has to wrap the ActionListener in a wrapper Action so its preferrable for you to do you own bindings.

Set keyboard shortcut for a JButton?

Why don't you just add an actionlistener to the JTextField (which would be triggered when the user hits enter).

userInput.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
// Do something
}

});

how to make a jbutton execute keyboard stroke in another component

You can use Action and KeyBindings. Check out this example:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class TestKeyBinding {

private JFrame frame;

public final class PrintAction extends AbstractAction {

public PrintAction() {
super("Print");
}

@Override
public final void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Perform some printing");
}
}

protected void initUI() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PrintAction printAction = new PrintAction();
JButton button = new JButton("Print");
button.registerKeyboardAction(printAction, KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK),
JComponent.WHEN_IN_FOCUSED_WINDOW);
button.setAction(printAction);
JComponent comp = new JComponent() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
frame.add(comp, BorderLayout.NORTH);
frame.add(button);
frame.setSize(300, 300);
frame.setVisible(true);
comp.requestFocusInWindow();
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestKeyBinding().initUI();
}
});
}
}


Related Topics



Leave a reply



Submit