2015-10-05 8 views
2

Я зарегистрировал привязки клавиш к кнопке, и я хотел бы реагировать на все числовые нажатия клавиш. Я мог регистрировать различное событие для каждого ключа (0-9), но это глупо. Так можно ли обрабатывать все это в одном случае?Как настроить привязки клавиш, которые обрабатывают все числовые штрихи в одном событии?

Вот мой код, который реагирует только на кнопку 0 на цифровой клавиатуре:

private void setKeyBindings() { 
    AbstractAction aa = new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      System.out.println("Here"); 
     } 
    }; 

    this.editButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0"); 
    this.editButton.getActionMap().put("0", aa); 
} 

Благодаря

ответ

3

Так же можно обрабатывать все это в одном случае?

Вы можете создать один слушатель событий, которые будут использоваться всеми креплениями:

Может быть что-то вроде:

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()); 
      System.out.println(e.getActionCommand()); 
       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(); 
      } 
     }); 
    } 
} 
+0

Отличный ответ, @camickr. Компиляция, как есть, проста в реализации. – DSlomer64

+0

Это предполагает, что у вас есть кнопка для возврата «Action» и привязки клавиш с помощью;) – MadProgrammer

+0

@MadProgrammer, вам не нужна кнопка. Я изменил код, чтобы продемонстрировать добавление привязки к панели кнопок. Работает с кнопкой или без кнопки, добавленной в панель. Команда действия будет содержать символ с клавиатуры. – camickr

2

Вопрос, который вы знаете, есть, как признать, что ход клавиши действие реагирует (или почему действие называлось)

Вместо того, с помощью одного экземпляра действия, вы могли бы создать единое специальное действие, которое вы могли бы зерно с информацией, необходимой для того, чтобы сделать свою работу

public class NumberAction extends AbstractAction { 
    private int number; 

    public NumberAction(int number) { 
     this.number = number 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     System.out.println("Here"); 
    } 
} 

Затем, вы можете создать их, как вам нужно ....

private void setKeyBindings() { 
    this.editButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD0, 0), "0"); 
    this.editButton.getActionMap().put("0", new NumberAction(0)); 
    //Other numbers... 
} 
+0

решение Camickr работала отлично. Однако мне нужно сделать то же самое для клавиш F (F1, F2, etx.) –

+0

Решение Camickrs полагается на текст кнопки, чтобы установить свойство ActionCommand ActionEvent, поэтому, если у вас нет кнопки, поддерживающей действие, тогда вам нужно будет сделать что-то подобное. Этот подход также позволяет повторно использовать действие для таких вещей, как JMenuItems, JButtons, JTextFields и привязки клавиш, не полагаясь на какие-либо потенциальные побочные эффекты. – MadProgrammer