当前位置: 首页 > 面试题库 >

带有摆动Java的键盘输入

白翰海
2023-03-14
问题内容

我正在使用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_WINDOWWHEN_FOCUSEDWHEN_ANCESTOR_OF_FOCUSED_COMPONENT



 类似资料:
  • 问题内容: 我如何限制键盘输入,然后再将其输入到JTextField中(摆动) 我只允许用户输入“ + -0123456789abcdef,”。字符,且不超过1 或char 我的JTextField是单行输入字段。 谢谢! 问题答案: 您可以通过DocumentFilter实现此目的。这使您可以控制任何文档类型的文本处理。或使用JFormattedTextField

  • 问题内容: 我正在用Java编写游戏,现在是Swing + JOGL-一个带有GLCanvas的JFrame。 我使用etc.事件()处理输入,但似乎无法正常工作: 当我同时按下3个以上的键时,它们无法正确注册 -显然这是键盘的错误,我必须找到替代的控制方案。 窗口丢失后,重新获得焦点,输入完全停止工作… 我究竟做错了什么? 有没有更好的方法来处理Java中的键盘输入? (除非我别无选择,否则我不

  • 问题内容: 我已经实现了ListSelectionListener,如下所示,因此在选择了第一个表中的特定行之后,第二个表将进行相应的更新。 有没有一种方法不仅可以在选择鼠标时,而且可以在通过键盘进行选择时调用侦听器? 问题答案: 出现异常体验的原因-没有通过键盘选择的通知-是valueIsAdjusting针对键盘与鼠标触发的选择事件的微妙不同设置: 键盘触发的选择(即使带有修饰符)仅触发一次(

  • 我正在使用python 3.4的curses,我需要一个简单的方法来用箭头键计数,每次我按上,x给自己加1,按下,它从自己减去1。

  • 问题内容: 我已经用Java设计了自己的合成器,现在我想将其与Midi键盘连接。我在下面的课程搜索所有带有发射器的Midi设备。它成功找到了我的Midi键盘。我将自己的接收器添加到每个设备的每个发送器中,以便它可以接收所有可能的信息。通过阅读所有帮助文档和Java文档,我知道Transmitter将MidiEvents发送给Receiver,然后由Receiver使用send方法处理它们。因此,我