我正在使用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。
参数:
condition
-WHEN_IN_FOCUSED_WINDOW
,WHEN_FOCUSED
,WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
之一