键盘输入与swing Java

我正在使用java swing工作计算器,我希望能够通过键盘输入数字和操作。 我似乎无法让它发挥作用。

import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Calculator extends JFrame implements ActionListener { JPanel[] row = new JPanel[6]; JButton[] button = new JButton[23]; JMenuBar menubar = new JMenuBar(); JMenu file = new JMenu("File"); JMenuItem clear = new JMenuItem("Clear"); JMenuItem exit = new JMenuItem("Exit"); String[] buttonString = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "/", "C", "√", "+/-", "=", "0", "mod", "x^2", "x^y", "?"}; int[] dimW = {300,45,100,90}; int[] dimH = {35, 40}; Dimension displayDimension = new Dimension(dimW[0], dimH[0]); Dimension regularDimension = new Dimension(dimW[1], dimH[1]); Dimension rColumnDimension = new Dimension(dimW[2], dimH[1]); Dimension zeroButDimension = new Dimension(dimW[3], dimH[1]); boolean[] function = new boolean[6]; double[] temporary = {0, 0}; JTextArea display = new JTextArea(1,20); Font font = new Font("Times new Roman", Font.BOLD, 14); Calculator() { super("My Calculator"); clear.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ clear(); } }); exit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){ System.exit(0); } }); file.add(clear); file.add(exit); menubar.add(file); setJMenuBar(menubar); setDesign(); setSize(420, 350); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); GridLayout grid = new GridLayout(6,5); setLayout(grid); for(int i = 0; i < 6; i++) function[i] = false; FlowLayout f1 = new FlowLayout(FlowLayout.CENTER); FlowLayout f2 = new FlowLayout(FlowLayout.CENTER,1,1); for(int i = 0; i < 6; i++) row[i] = new JPanel(); row[0].setLayout(f1); for(int i = 1; i < 6; i++) row[i].setLayout(f2); for(int i = 0; i < 23; i++) { button[i] = new JButton(); button[i].setText(buttonString[i]); button[i].setFont(font); button[i].addActionListener(this); } //here is where I'm trying to map button[0] to key 7. button[0].getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD7,0), button[0].getText()); button[0].getActionMap().put(button[0].getText(), new Click(button[0])); display.setFont(font); display.setEditable(false); display.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); display.setPreferredSize(displayDimension); for(int i = 0; i < 14; i++) button[i].setPreferredSize(regularDimension); for (int i = 19; i < 23; i++) button[i].setPreferredSize(zeroButDimension); for(int i = 14; i < 18; i++) button[i].setPreferredSize(rColumnDimension); button[18].setPreferredSize(zeroButDimension); row[0].add(display); for(int i = 0; i < 4; i++) row[1].add(button[i]); row[1].add(button[14]); for(int i = 4; i < 8; i++) row[2].add(button[i]); row[2].add(button[15]); for(int i = 8; i < 12; i++) row[3].add(button[i]); row[3].add(button[16]); row[4].add(button[18]); for(int i = 12; i < 14; i++) row[4].add(button[i]); row[4].add(button[17]); for(int i = 19; i<23; i++) row[5].add(button[i]); for(int i = 0; i<6; i++) add(row[i]); setVisible(true); } public final void setDesign() { try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); } catch(Exception e) { } } public class Click extends AbstractAction { JButton button; public Click(JButton button) { this.button = button; } @Override public void actionPerformed(ActionEvent e) { button.doClick(); } } public void actionPerformed(ActionEvent ae) { if(ae.getSource() == button[0]) display.append("7"); if (ae.getSource() == button[1]) display.append("8"); if(ae.getSource() == button[2]) display.append("9"); if(ae.getSource() == button[3]) {//add temporary[0] = Double.parseDouble(display.getText()); function[0] = true; display.setText(""); } if(ae.getSource() == button[4]) display.append("4"); if(ae.getSource() == button[5]) display.append("5"); if(ae.getSource() == button[6]) display.append("6"); if(ae.getSource() == button[7]) {//subtract function[1]= true; temporary[0] = Double.parseDouble(display.getText()); display.setText(""); } if(ae.getSource() == button[8]) display.append("1"); if(ae.getSource() == button[9]) display.append("2"); if(ae.getSource() == button[10]) display.append("3"); if(ae.getSource() == button[11]) {//multiply function[2] = true; temporary[0] = Double.parseDouble(display.getText()); display.setText(""); } if(ae.getSource() == button[12]) display.append("."); if(ae.getSource() == button[13]) {//divide function[3] = true; temporary[0] = Double.parseDouble(display.getText()); display.setText(""); } if(ae.getSource() == button[14]) clear(); if(ae.getSource() == button[15]) getSqrt(); if(ae.getSource() == button[16]) getPosNeg(); if(ae.getSource() == button[17]) getResult(); if(ae.getSource() == button[18]) display.append("0"); if(ae.getSource() == button[19]) {//modular function[4] = true; temporary[0] = Double.parseDouble(display.getText()); display.setText(""); } if(ae.getSource() == button[20]) getSquare(); if(ae.getSource() == button[21]) {//power function[5] = true; temporary[0] = Double.parseDouble(display.getText()); display.setText(""); } if(ae.getSource() == button[22]) display.setText("This APT has super cow powers"); } public void clear() { try { display.setText(""); for (int i = 0; i<6; i++) function[i]=false; for (int i = 0; i<2; i++) temporary[i] = 0; } catch (NullPointerException e) { } } public void getSqrt() { try { double value = Math.sqrt(Double.parseDouble(display.getText())); display.setText(Double.toString(value)); } catch (NumberFormatException e) { } } public void getPosNeg() { try { double value = Double.parseDouble(display.getText()); if (value != 0) { value = value * -1; display.setText(Double.toString(value)); } } catch (NumberFormatException e) { } } public void getSquare() { try { double value = Double.parseDouble(display.getText()); value = value*value; display.setText(Double.toString(value)); } catch (NumberFormatException e) { } } public double getPow() { double value = Double.parseDouble(display.getText()); value = Math.pow(temporary[0], temporary[1]); return value; } public void getResult() { double result = 0; temporary[1] = Double.parseDouble(display.getText()); String temp0 = Double.toString(temporary[0]); String temp1 = Double.toString(temporary[1]); try { if(temp0.contains("-")) { String[] temp00 = temp0.split("-",2); temporary[0] = (Double.parseDouble(temp00[1]) * -1); } if (temp1.contains("-")) { String[] temp11 = temp1.split("-",2); temporary[1] = (Double.parseDouble(temp11[1]) *-1); } } catch (ArrayIndexOutOfBoundsException e) { } try { if(function[5]) result = getPow(); else if(function[2]) result = temporary[0] * temporary[1]; else if(function[3]) result = temporary[0] / temporary[1]; else if (function[4]) result = temporary[0] % temporary[1]; else if(function[0]) result = temporary[0] + temporary[1]; else if(function[1]) result = temporary[0] - temporary[1]; display.setText(Double.toString(result)); for(int i = 0; i<6; i++) function[i] = false; } catch(NumberFormatException e) { } } public static void main(String[] arguments) { Calculator c = new Calculator(); } } 

我想这是问题所在:

 button[0].getInputMap().put(...); 

从JComponent.getInputMap() javadoc:

返回组件具有焦点时使用的InputMap 。 这是getInputMap(WHEN_FOCUSED)便捷方法。

因此按钮必须具有正确工作的焦点。 既然你正在做一个计算器,我建议你改用它:

 button[0].getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(...); 

JComponent.getInputMap(int condition) :

返回条件期间使用的InputMap。

参数:

conditionWHEN_IN_FOCUSED_WINDOWWHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENT