Keyboard Input with swing Java

为君一笑 提交于 2019-12-31 02:15:13

问题


I am working a calculator using java swing and I want to be able to enter the numbers and operations via keyboard. I can't seem to get it working.

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();
    }

}

回答1:


I think here is the problem:

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

From JComponent.getInputMap() javadoc:

Returns the InputMap that is used when the component has focus. This is convenience method for getInputMap(WHEN_FOCUSED).

So the button must have the focus to properly work. Since you're doing a calculator I'd suggest you use this instead:

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

JComponent.getInputMap(int condition):

Returns the InputMap that is used during condition.

Parameters:

condition - one of WHEN_IN_FOCUSED_WINDOW, WHEN_FOCUSED, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT



来源:https://stackoverflow.com/questions/20007625/keyboard-input-with-swing-java

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