```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)