2015-10-11 6 views
2

Я пытаюсь интегрировать привязки клавиш в программу, которую я создаю, но поскольку эта программа длинная, я пытаюсь изучить меньшую аналогичную кодированную программу, которую я нашел в StackOverflow.

Вот код, я использую:
ActionEvent не распознает привязку CTRL

import java.awt.Color; 
 
import java.awt.FlowLayout; 
 
import java.awt.event.ActionEvent; 
 

 
import javax.swing.AbstractAction; 
 
import javax.swing.JButton; 
 
import javax.swing.JFrame; 
 
import javax.swing.JLabel; 
 
import javax.swing.JPanel; 
 
import javax.swing.SwingUtilities; 
 

 
public class Demo { 
 

 
\t @SuppressWarnings("serial") 
 
\t private void initGUI() { 
 
\t \t JPanel content = new JPanel(new FlowLayout()); 
 
\t \t content.add(new JLabel("Test:")); 
 

 
\t \t AbstractAction buttonPressed = new AbstractAction() { 
 
\t \t \t @Override 
 
\t \t \t public void actionPerformed(ActionEvent e) { 
 
\t \t \t \t System.out.println(e.getActionCommand()); 
 
\t \t \t \t System.out.println(e.getSource()); 
 
\t \t \t \t if ("a".equals(e.getActionCommand())) 
 
\t \t \t \t \t content.setBackground(new Color(227, 19, 19)); 
 
\t \t \t \t if ("b".equals(e.getActionCommand())) 
 
\t \t \t \t \t content.setBackground(new Color(0, 225, 19)); 
 
\t \t \t } 
 
\t \t }; 
 

 
\t \t JButton submit = new JButton("Submit"); 
 
\t \t submit.addActionListener(buttonPressed); 
 

 
\t \t submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(
 
      javax.swing.KeyStroke.getKeyStroke(
 
      java.awt.event.KeyEvent.VK_A, 
 
      java.awt.event.InputEvent.CTRL_DOWN_MASK), 
 
      "A_pressed"); 
 
\t \t submit.getActionMap().put("A_pressed", buttonPressed); 
 
     
 
     submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put(
 
     javax.swing.KeyStroke.getKeyStroke(
 
      java.awt.event.KeyEvent.VK_B, 0), 
 
     "B_pressed"); 
 
\t \t submit.getActionMap().put("B_pressed", buttonPressed); 
 

 
\t \t content.add(submit); 
 

 
\t \t JFrame frame = new JFrame("Demo"); 
 
\t \t frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
\t \t frame.setContentPane(content); 
 
\t \t frame.pack(); 
 
\t \t frame.setLocationRelativeTo(null); 
 
\t \t frame.setVisible(true); 
 
\t } 
 

 
\t public static void main(String[] args) { 
 
\t \t SwingUtilities.invokeLater(new Runnable() { 
 

 
\t \t \t @Override 
 
\t \t \t public void run() { 
 
\t \t \t \t new Demo().initGUI(); 
 
\t \t \t } 
 
\t \t }); 
 
\t } 
 
}

Что я, что должно произойти, чтобы нажать CTRL + A и имеют изменить цвет фона. Однако, когда я это делаю, System.out.println(e.getActionCommand()) возвращает символ, который выглядит как вопросительный знак в поле, как будто это неизвестный персонаж или что-то в этом роде. Программа работает, если вы нажмете B, но добавление модификатора CTRL работает некорректно.

Является ли проблема чем-то, что я не делаю правильно? Является ли программа работоспособной, и я не знаю, как сравнивать e.getActionCommand() и что когда-либо строка CTRL + A возвращается как ActionEvent? Пожалуйста помоги.

ответ

0

, насколько я знаю, если действие не имеет своего действия. Командный ящик явно установлен, будет установлен при создании ActionEvent. в вашем коде actionCommmand будет строковое представление charKey вашего KeyStroke (б и Ctrl + A не) , так что я мог бы предложить, чтобы поставить различные действия для каждого действия:

class simpleAction extends AbstractAction { 

     public simpleAction (String name) { 
      super(); 
      putValue (Action.ACTION_COMMAND_KEY, name); 
     } 

     @Override 
     public void actionPerformed (ActionEvent e) { 
      System.out.println ("getActionCommand----->" + e.getActionCommand()); 
      System.out.println ("getSource----->" + e.getSource()); 

      if ("a".equals (e.getActionCommand())) { 
       content.setBackground (new Color (227, 19, 19)); 
      } 
      if ("b".equals (e.getActionCommand())) { 
       content.setBackground (new Color (0, 225, 19)); 
      } 

     } 
    } 

    JButton submit = new JButton ("Submit"); 
    submit.addActionListener (new simpleAction ("Submit")); 

    submit.getInputMap (javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put (
      javax.swing.KeyStroke.getKeyStroke (java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_DOWN_MASK), "A_pressed"); 
    submit.getActionMap().put ("A_pressed", new simpleAction ("a")); 

    submit.getInputMap (javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).put (
      javax.swing.KeyStroke.getKeyStroke (
        java.awt.event.KeyEvent.VK_B, 0), 
      "B_pressed"); 
    submit.getActionMap().put ("B_pressed", new simpleAction ("b")); 

или второй раствор это проверить строковое представление для Ctrl + A

так что вы измените

if ("a".equals (e.getActionCommand())) { 
       content.setBackground (new Color (227, 19, 19)); 
      } 

по

if ("\u0001".equals (e.getActionCommand())) { 
       content.setBackground (new Color (227, 19, 19)); 
      } 
+0

Вы делаете то же самое дважды для второго решения. Кроме того, почему работает второе решение? Является ли «\ u0001» символом Unicode для CTRL + A? Как изменить его, чтобы я мог использовать разные буквы? – IAmTheBee

+0

Да, "\ u0001" есть. – Billydan