qq_52455321 2022-01-07 23:25 采纳率: 33.3%
浏览 40
已结题

在计算器运行中,总是得不到结果




```package cal;

public class panel {
     public static void main(String[] args) {
            Calculation cal=new Calculation();
        }
}
calculation.Java:
package cal;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.EventListener;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.lang.*;
public class Calculation extends JFrame implements ActionListener{
    public JTextField txfResult;//显示操作结果的文本框
    public JTextField textField1;
    public JTextField textField;
    public JTextField textField2;
    public JTextArea textArea;
    JTextField txfM;//显示记忆的索引值的文本框
    Double dM=0d;//存储数据
    public Calculation() {
        super("swing 计算器实例");
        /*设置用于显示的文本框*/
        textField =new JTextField("0",13);//初始文本显示0  最大列数30
        textField.setBackground(Color.WHITE);
        textField.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示
        textField.setEditable(false);//文本框不可编辑  即为readOnly只读属性
        textField1 =new JTextField("0",6);//初始文本显示0  最大列数30
        textField1.setBackground(Color.WHITE);
        textField1.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示
        textField1.setEditable(false);//文本框不可编辑  即为readOnly只读属性
        textField2 =new JTextField("0",13);//初始文本显示0  最大列数30
        textField2.setBackground(Color.WHITE);
        textField2.setHorizontalAlignment(JTextField.RIGHT);//数字在文本框中靠右显示
        textField2.setEditable(false);//文本框不可编辑  即为readOnly只读属性
        JPanel viewPanel=new JPanel();
        viewPanel.add(textField);
        viewPanel.add(textField1);
        viewPanel.add(textField2);
        /*设置用于控制数字的键与显示记忆索引值的文本框*/
        txfM=new JTextField(2);//最长2列
        JPanel panel=new JPanel();
        /*数字和运算符键*/
        String[][] names = {{"1", "2", "3", "/", "c"}, {"4", "5", "6", "*", "退格"}, {"7", "8", "9", "-", "sqrt"}, {"0", "+/-", ".", "+", "="}};
        JPanel buttonPanel =new JPanel();//数字和运算符的面板
        JButton[][] buttons = new JButton[4][5];
        final GridLayout gridLayout = new GridLayout(4, 0);
        gridLayout.setHgap(10);
        gridLayout.setVgap(10);
        buttonPanel.setLayout(gridLayout);
        //一个 循环放好所有数字和运算符组件
        for (int row = 0; row < names.length; row++) {
            for (int col = 0; col < names.length + 1; col++) {
                buttons[row][col] = new JButton(names[row][col]);
                buttonPanel.add(buttons[row][col]);
                buttons[row][col].addActionListener(this);
            }
        }
        panel.setLayout(new BorderLayout());
        panel.add(viewPanel,BorderLayout.NORTH);
        panel.add(buttonPanel,BorderLayout.CENTER);
        final JLabel leftLabel = new JLabel();
        leftLabel.setPreferredSize(new Dimension(10, 0));
        panel.add(leftLabel, BorderLayout.WEST);
        final JLabel rightLabel = new JLabel();
        rightLabel.setPreferredSize(new Dimension(10, 0));
        panel.add(rightLabel, BorderLayout.EAST);
        getContentPane().add(panel, BorderLayout.WEST);
        final JPanel panelx = new JPanel();
        panelx.setLayout(new BorderLayout());
        getContentPane().add(panelx, BorderLayout.CENTER);
        final JPanel viewPanel1 = new JPanel();
        panelx.add(viewPanel1, BorderLayout.NORTH);
        JTextField txfResult = new JTextField("0");
        txfResult.setEditable(false);
        txfResult.setHorizontalAlignment(SwingConstants.CENTER);
        txfResult.setColumns(18);
        viewPanel1.add(txfResult);
        JTextArea textArea = new JTextArea();
        textArea.setColumns(15);
        textArea.setRows(4);
        textArea.setLineWrap(true);
        final JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(textArea);
        panelx.add(scrollPane, BorderLayout.CENTER);
        final JPanel buttonPanel1 = new JPanel();
        panelx.add(buttonPanel1, BorderLayout.SOUTH);
        final JButton aButton = new JButton();
        aButton.setText("保存");
        aButton.addActionListener(this);
        buttonPanel1.add(aButton);
        final JButton bButton = new JButton();
        bButton.setText("查看");
        bButton.addActionListener(this);
        buttonPanel1.add(bButton);
        final JButton cButton = new JButton();
        cButton.setText("清除");
        cButton.addActionListener(this);
        buttonPanel1.add(cButton);
       pack();
        setVisible(true);
        setResizable(false);//禁止最大化
        setLocationRelativeTo(null);//居中显示
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
    }
   
        // TODO Auto-generated method stub
        public boolean newDigital=true;//类内全局boolean变量 用于表示是否是输入数的标志
        public String operation="";//表示运算符的字符串
        public double d1;//二元运算前操数
        public double d2;//二元运算后操作数
        public int optionValue;//区别加减乘除运算符的变量
        /*监听方法*/
        @Override
        public void actionPerformed(ActionEvent e) {
            String s=(e.getActionCommand());//返回与此动作相关的命令字符串  就是button上显示的字
            JButton str=(JButton)e.getSource();
            /*后退键*/
            if(s.equals("退格")) {
                if (textField2.getText().equals(""))
                    pressBackspace1();
                else pressBackspace2();
            }
            /*清0键*/
            if(s.equals("C")) {
                txfResult.setText("0");
                textField.setText("0");
                textField1.setText("0");
                textField2.setText("0");
                optionValue=0;//表示运算符的变量设置为0
                newDigital=true;//表示是否新输入的数的标志设置为true
            }
            /*数字键*/
            if("0123456789.".contains(s)) {
                if(textField1.getText().equals("0")) {
                    if(newDigital) {
                        textField.setText(s);
                    }else if(s.equals(".")&&(!textField.getText().contains("."))) {
                        textField.setText(textField.getText()+".");
                    }else if(!s.equals(".")) {
                        textField.setText(textField.getText()+s);
                    }
                    newDigital=false;
                }    
                else {
                    if(newDigital) {
                        textField2.setText(s);
                    }else if(s.equals(".")&&(!textField2.getText().contains("."))) {
                        textField2.setText(textField2.getText()+".");
                    }else if(!s.equals(".")) {
                        textField2.setText(textField2.getText()+s);
                    }
                    newDigital=false;
                }
            }
            /* 表示数字正负符号+/- */
            if(s.equals("+/-")) {
                double d=Double.parseDouble(s.trim());//获取输入的数字
                txfResult.setText(String.valueOf(-d));//取得获取输入数字的相反数
                return;
            }
            //////////////////////////////////////////////////////加减乘除运算的实现/////////////////////////////////////////////////////////  
            if(s.equals("+")) {
                d1=Double.valueOf(textField.getText());//立刻获取前操作数的值
                textField1.setText("+");
                optionValue=1;//设置运算符标志
            }
            if(s.equals("-")) {
                d1=Double.parseDouble(textField.getText());
                textField1.setText("-");
                optionValue=2;
            }
            if(s.equals("*")) {
                d1=Double.parseDouble(textField.getText());
                textField1.setText("*");
                optionValue=3;
            }
            if(s.equals("/")) {
                d1=Double.parseDouble(textField.getText());
                textField1.setText("/");
                optionValue=4;
            }
            if(s.equals("=")) {
                d2=Double.valueOf(textField2.getText());//获取后操作数的值
                Double num=0.0;
                txfResult.setText("0");
                /*根据运算符标志的不同值确定计算结果*/
                switch(optionValue) {
                case 1:
                    num=d1+d2;
                    break;
                case 2:
                    txfResult.setText(String.valueOf(d1-d2));
                    break;
                case 3:
                    txfResult.setText(String.valueOf(d1*d2));
                    break;
                case 4:
                    if(d2!=0) {
                        txfResult.setText(String.valueOf(d1/d2));
                    }else {
                        txfResult.setText("除数不能为0");
                        return;
                    }
                    break;              
                }
                operation="";//运算结束 清空运算符
                txfResult.setText(txfResult.getText()+num.toString());
            } 
            String str1=textField.getText()+textField1.getText()+textField2.getText()+"="+txfResult.getText();
            textArea.setText(str1+textArea.getText());
            ////////////////////////////////求平方根 倒数 百分比运算/////////////////////////////////
            if(s.equals("sqrt")) {
                double d=Double.parseDouble(textField.getText().trim());//获取操作数的值
                if(d>0) {
                    txfResult.setText(String.valueOf(Math.sqrt(d)));//计算该值的平方根
                }else {
                    txfResult.setText("负数不能计算平方根");
                }
            }
            ///////////////////////////////////////////实现数据的记忆功能///////////////////////////////////
            if(s.equals("清除")) {//清空存储数据
                txfResult.setText("");
                dM=0d;
                newDigital=true;
            }
            if(s.equals("保存")) {
                if(txfM.getText().trim()!="") {
                    txfResult.setText(""+dM);//显示存储数字当前值
                }
            }
            if(s.equals("查看")) {
                dM=Double.parseDouble(txfResult.getText().trim());
                    txfM.setText("M");//存储区显示M
            }    
        }
        
```java


    public void pressBackspace1() {//处理当按下C键时,第一个文本框输入的数字回退一位//
        String text=textField.getText();
        int i=text.length();
        if(i>0) {
            text=text.substring(0, i-1);
            if(text.length()==0) {
                textField.setText("");
                newDigital=true;
            }else textField.setText(text);
        }
    }
    public void pressBackspace2() {//处理当按下C键时,第二个文本框输入的数字回退一位//
        String text=textField2.getText();
        int i=text.length();
        if(i>0) {
            text=text.substring(0, i-1);
            if(text.length()==0) {
                textField2.setText("");
                newDigital=true;
            }else textField.setText(text);
        }
}

}
这是报错信息:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "javax.swing.JTextField.getText()" because "this.txfResult" is null
at cal.Calculation.actionPerformed(Calculation.java:207)

  • 写回答

1条回答 默认 最新

  • IT不码农 2022-01-08 19:07
    关注

    82行的 JTextField txfResult = new JTextField("0");
    改成 this.txfResult = new JTextField("0");
    87行的 JTextArea textArea = new JTextArea();
    改成 this.textArea = new JTextArea();
    你这是在构造函数了定义了局部变量,且名字跟成员属性重名,导致成员属性没有初始化,抛的空指针

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 创建了问题 1月7日

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波