使用Java中的用户图形界面设计实现计算器,本计算器可以实现简单的加减乘除功能和保存计算过程。
计算器设计思想:
1、分父子两个窗口,父窗口为计算器的相关界面,子窗口用于显示保存的计算过程。
2、计算器在运行时只会出现父窗口,在父窗口中有历史按钮,点击历史按钮调用出子窗口。
3、在计算器项目下创建一个文本文件history,将计算过程写存进此文件中,在调出子窗口时,子窗口进行读取此文件中的计算过程内容用于显示给用户。
相关代码:
父窗口:
package 计算器;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener {
// 属性
JTextField txtResult;
boolean firstDigit = true;// 用于判断是否是数字
String operator = "=";// 先初始化为等号,等到执行相应运算时再更改
boolean operateValidFlag = true;// 判断除数是否为0
double resultNum = 0.0;// 可以暂存目前的最终结果
double resultString;//用来打印每次计算后的结果
// 方法
public Calculator() {
setTitle("计算器");
setSize(240, 270);
setResizable(true);//用户可以调整窗口大小
setLocationRelativeTo(null);//将窗口设置在屏幕中间
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = this.getContentPane();//构造一个容器
contentPane.setLayout(new BorderLayout(1, 5));//此容器的布局为边界布局
JPanel pnlNorth = new JPanel();
JPanel pnlCenter = new JPanel();
pnlNorth.setLayout(new BorderLayout());//北部面板的布局为边界布局
pnlCenter.setLayout(new GridLayout(4, 4, 3, 3));//中间面板的布局是网格布局
Font font = new Font("Times Roman", Font.BOLD, 20);//设置字体
contentPane.add(BorderLayout.NORTH, pnlNorth);
contentPane.add(BorderLayout.CENTER, pnlCenter);
txtResult = new JTextField();
txtResult.setFont(font);
txtResult.setEnabled(false);//此组件不可相应,即这个文本框不能被用户操作
JButton btnhs = new JButton();// 添加一个历史记录的按钮
Icon history = new ImageIcon("lishi.png");// 添加一个照片
btnhs.setIcon(history);// 给按钮添加图片
btnhs.setBorderPainted(false);// 不绘制边框
btnhs.setBorder(null);// 设置边框为空
btnhs.setFont(font);//设置字体
btnhs.addActionListener(new ActionListener() {// 历史按钮的监听器
@Override
public void actionPerformed(ActionEvent e) {// 事件触发后打开子窗口
new ChildJfarme();
}
});
pnlNorth.add(BorderLayout.CENTER, txtResult);
pnlNorth.add(BorderLayout.EAST, btnhs);
String[] captions = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+", };
for (int i = 0; i < captions.length; i++) {
JButton btn = new JButton(captions[i]);
btn.setFont(font);
pnlCenter.add(btn);
btn.addActionListener(this);
}
}
public static void main(String[] args) {
JFrame frame = new Calculator();
frame.setVisible(true);
//写文件
File file = new File("history");// 创建一个文件
try {
PrintStream printStream = new PrintStream(file);//使用file文件创建一个打印流
System.setOut(printStream);//重新分配,将控制台的内容打印出进文件中
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//对按钮进行的反应
public void actionPerformed(ActionEvent event) {
String label = event.getActionCommand();
System.out.print(label);//将按键符打印出来
if ("0123456789.".indexOf(label) >= 0) {//indexof方法是将所给字符进行比较,若所给元素中不包含则返回-1
//无论整数还是小数都一起提取出来
handleNumber(label);
} else {
//将当前要执行的运算的运算符赋给operator
handleOperator(label);
}
if (label.equals("=") == true) {
System.out.println(resultString);
}
}
//提取数字
void handleNumber(String key) {
if (firstDigit) {
txtResult.setText(key);// 在文本框中显示数字的字符串
} else if ((key.equals(".")) && (txtResult.getText().indexOf(".") < 0)) {//只有当点击小数点和显示半中没有小数点时才执行
txtResult.setText(txtResult.getText() + ".");// 在文本框中显示小数数字
} else if (!key.equals(".")) {
txtResult.setText(txtResult.getText() + key);// 在文本框中显示整数数字的字符串
}
firstDigit = false;// 当第一个数字显示完之后,即可重置为false
}
//进行运算
void handleOperator(String key) {
if (operator.equals("/")) {
//判断除数是否为0
if (getNumberFromText() == 0.0) {
operateValidFlag = false;// 判断除数是否为零
txtResult.setText("除数不能为零");
} else {
resultNum /= getNumberFromText();
}
} else if (operator.equals("+")) {
resultNum += getNumberFromText();
} else if (operator.equals("-")) {
resultNum -= getNumberFromText();
} else if (operator.equals("*")) {
resultNum *= getNumberFromText();
} else if (operator.equals("=")) {
resultNum = getNumberFromText();
}
if (operateValidFlag) {
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
txtResult.setText(String.valueOf(t1));//将long型转换成string类型
} else {
txtResult.setText(String.valueOf(resultNum));//将double型转换成string型
}
}
operator = key;
firstDigit = true;
operateValidFlag = true;
resultString = getNumberFromText();
}
double getNumberFromText() {
double result = 0;
try {
result = Double.valueOf(txtResult.getText()).doubleValue();// 把String转化成Double类型的对象,并求double的原始值
} catch (NumberFormatException e) {
}
return result;
}
}
子窗口:
package 计算器;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ChildJfarme {
JTextArea textArea;
public ChildJfarme(){
JFrame Cframe=new JFrame("历史记录");
Cframe.setSize(240, 270);
textArea=new JTextArea();//添加一个文本区用于显示读取的文本
textArea.setLineWrap(true);
JScrollPane jScrollPane=new JScrollPane(textArea);//创建轻量级组件的可滚动视图以便存放文本区
jScrollPane.setSize(220, 270);
Cframe.add(jScrollPane);
Cframe.setLocationRelativeTo(null);//窗口显示在屏幕中央
Cframe.setVisible(true);//窗口显示
read();
}
private void read() {
// TODO 自动生成的方法存根
File f =new File("history");
FileReader fr=null;
try {
fr=new FileReader(f);
char ch[]=new char[1024];
@SuppressWarnings("unused")
int count;
while ((count=fr.read(ch))!=-1) {
String s =new String(ch);
textArea.append(s);
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
运行结果图:
此计算器只是可以进行简单计算 ,不可以进行科学计算,并在设计上还有一些不足。