Responding to Button using KeyBIndings

我只是一个虾纸丫 提交于 2019-12-31 02:32:37

问题


I want to make a program with these goals:

1) Make a JButton 2) Attach the button to a key (The "A" Key) using KeyBindings 3) Execute some code when "A" is clicked

Here is the code I have so far:

// Imports

Public class Test{

JButton button = new JButton();

//...

Test(){

button.getInputMap().put(KeyStroke.getKeyStroke("A"), "Pressed");


//...

}

// Where do I add the code that responds when button is pressed?
}

Now where do I add the code that I want it to execute when the button is pressed?


回答1:


you need to add an action listener, specificaly for actionPerformed. declare this somewhere inside your constructor:

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.KeyStroke;

public class Main {
    public static void main(String[] argv) throws Exception {

        JButton component = new JButton();
        MyAction action = new MyAction();
        component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F2"),
            action.getValue(Action.NAME));
    }
}

class MyAction extends AbstractAction {
    public MyAction() {
        super("my action");
    }

    public void actionPerformed(ActionEvent e) {
        //Here goes the code where the button does something
        System.out.println("hi");//In this case we print hi
    }
}

In this example if we press F2 it will be the equivalent of pressing the button.




回答2:


Two ways I can think of:

  • Have JButton and and Key Bindings share the same AbstractAction, or perhaps better
  • Simply call doClick() on the button from the key binding.

KeyBindingEg.java

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

public class KeyBindingEg extends JPanel {
   private JButton btnA = new JButton();

   public KeyBindingEg() {
      Action btnAction = new ActionOne("A");
      Action keyBindingAction = new ActionTwo();

      int condition = JLabel.WHEN_IN_FOCUSED_WINDOW;
      InputMap inputmap = btnA.getInputMap(condition);
      ActionMap actionmap = btnA.getActionMap();

      final String aKeyPressed = "a key pressed";
      inputmap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), aKeyPressed );

      actionmap.put(aKeyPressed, keyBindingAction);
      // actionmap.put(aKeyPressed, btnAction); // one or the other, your choice

      btnA.setAction(btnAction);
      add(btnA);
   }

   private class ActionOne extends AbstractAction {
      public ActionOne(String text) {
         super(text);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         sharedMethod();
      }
   }

   private class ActionTwo extends AbstractAction {
      @Override
      public void actionPerformed(ActionEvent e) {
         btnA.doClick();
      }
   }

   private void sharedMethod() {
      System.out.println("Method called by either key bindings or action listener");
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("KeyBindingEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new KeyBindingEg());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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


来源:https://stackoverflow.com/questions/10591669/responding-to-button-using-keybindings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!