题目链接
题目描述:编写Java GUI程序,实现一个简单计算器。要求如下:
(1)设计的界面如下图所示:窗体的标题栏显示“模拟计算器—江海大”,1个文本框用于显示输入字符和计算结果;20个按钮控件作为字符输入按键或者功能按键。
2)计算功能:实现加、减、乘、除等双目运算,开平方、百分数等单目运算;
简单版计算器(MOOC提交版)
前言:本题目为实现字符串四则运算,采用栈的知识来进行解答,以下是简单版计算器的代码:
在文本框中可以实现字符串运算,注意有几个小陷阱。第一是小数点后面可能存在0,例如7.03,如果单纯使用栈的话会把0给去掉,解决办法就是一开始运算的时候就得注意!
当然关于一些按钮的操作这里就不再赘述了。
/**
* @author:Jacin Lee
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TestGUI {
public static void main(String[] args){
MainFrame a=new MainFrame();
}
}
class MainFrame extends JFrame implements ActionListener{
JPanel contentPane = new JPanel(); //框架内容面板
JPanel keyPane;//按键面板
JTextField txtShow = new JTextField(); //显示文本框
JButton []button=new JButton[20];
String name[]={"C","/", "*", "←","7", "8", "9", "-", "4", "5", "6", "+", "1", "2", "3", "√", "%", "0", ".", "="};//按钮标签数组
public MainFrame(){
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout());
setTitle("模拟计算器-江海大");
keyPane = new JPanel(new GridLayout(5,4,5,5)); //按钮键面板设计
txtShow.setText("");
for(int i=0;i<20;i++){
button[i]=new JButton(name[i]);
keyPane.add(button[i]);
button[i].addActionListener(this);
}
contentPane.add(txtShow,BorderLayout.NORTH);
contentPane.add(keyPane,BorderLayout.CENTER);
setLocationRelativeTo(null);
setResizable(false); //设置为不可调整大小
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
//按C键清空数据
if(e.getSource()==button[0]){
txtShow.setText("");
}
else if(e.getSource()==button[19]){
String s=txtShow.getText();
double m=calculate(s);
txtShow.setText(""+Double.toString(m));
}
else if(e.getSource()==button[3]){
String s=txtShow.getText();
if(s.length()>1){
s=s.substring(0, s.length()-1);
txtShow.setText(s);
}
}
else{
txtShow.setText(txtShow.getText()+e.getActionCommand());
}
}
public double calculate(String s){
Stack<Double> stk=new Stack<Double>();
double num=0;
//首先将num前面的符号边长 “+”
char sign='+';
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(Character.isDigit(c)){
num=num*10+(c-'0');
String str="";
str+=s.charAt(i)+".";
if(i<s.length()-1){
if(s.charAt(i+1)=='.'){
for(int j=i+2;j<s.length();j++){
if(s.charAt(j)>=48&&s.charAt(j)<=57){
str+=s.charAt(j);
}else{
break;
}
}
}
num=Double.parseDouble(str);
if(s.charAt(i+1)=='%'){
num/=100;
}
}
}
if(!Character.isDigit(c)||(i==s.length()-1)){
double pre;
switch(sign){
case '+':stk.push(num*1.0);break;
case '-':stk.push(-num*1.0);break;
case '*':pre=stk.pop();stk.push(pre*num*1.0);break;
case '/':pre=stk.pop();stk.push(pre*1.0/num);break;
case '√':stk.push(Math.sqrt(num));break;
// case '.':pre=stk.pop(); stk.push(pre+0.1*num);break;
default:break;
}
sign=c;
num=0;
}
}
double res=0;
while(!stk.empty()){
res+=stk.peek();
stk.pop();
}
return res;
}
}
复选框填空(MOOC)
程序填空题:完善程序,实现包括一个复选框的窗体。点选复选框,通过相应的事件处理后,能够在控制台显示复选框的选择信息。要求:在数字标示和注释符(//)的前面,填入合适代码;并且不要删除数字标示和注释符://(数字)。
直接附上代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
/*---在(1)处进行类声明:类名为MyCheck,继承自Frame类---*/
//(1)
public class MyCheck extends JFrame{
public MyCheck(){
super("GUI程序设计实验");
/*---在(2)处创建面板对象,并设置其布局管理方式为FlowLayout---*/
JPanel p=new JPanel(new FlowLayout());
//(2)
Checkbox cbx = new Checkbox("isPassed");
/*---在(3)处完成两个功能:向面板中加入组件cbx,为组件cbx注册监听器。此处填写两行语句---*/
p.add(cbx);
cbx.addItemListener(new InnerFrame());
//(3)
add(p);
/*---在(4)处设置窗体的属性:设置大小为(250,100),设置为可见。此处填写两行语句---*/
setSize(250,100);
setVisible(true);
//(4)
}
public static void main(String[] args){
new MyCheck();
}
/*---在(5)处声明内部类的类头:类名自定义---*/
//(5)
class InnerFrame implements ItemListener {
public void itemStateChanged(ItemEvent e){
System.out.println(e);
}
}
}
详细版计算器完整
既然是详细版那么就必须有一些详细设计。(全部代码请私信)
概要设计
MainFrame.java:实现主框架界面类
HandleNumber.java:数字按钮处理类
HandlePoint.java:小数点按钮处理类
HandleSign.java:正负号处理类
HandleEql.java:等号按钮处理类
HandleOP.java:运算按钮处理类
HandleBack.java:退格按钮处理类
HandleC.java:清空按钮处理类
HandleExit.java:退出按钮处理类。
部分关键代码:
MainFrame代码
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.*;
public class MainFrame extends JFrame {
JPanel contentPane = new JPanel(); //框架内容面板
JTextField txtShow = new JTextField(); //显示文本框
JPanel keyPane; //按钮键面板
JButton btnNumber[] = new JButton[10]; //数字按钮
//加,减,乘,除,等号,小数点,清0,正负号,退出,退格按钮
JButton btnAdd,btnSub,btnMul,btnDiv,btnEql,btnPoint,btnClear,btnSign,btnExit,btnBS;
String[] operator = {"0","",""}; //用来保存操作数1、运算符、操作数2的数组,初始均为空
static String lastClick = ""; //用户最近一次点击的按钮
HandleNumber handleNum; //数字处理监听器
HandleBack handleBack; //退格处理监听器
HandlePoint handlePoint; //小数点处理监听器
HandleExit handleExit; //退出处理监听器
HandleC handleC; //清除处理监听器
HandleSign handleSign; //正负号处理监听器
HandleEql handleEql; //等号处理监听器
HandleOP handleOP; //运算符处理监听器
MainFrame(String s){
super(s);
setSize(350,250);
setLocationRelativeTo(null);
setResizable(false); //设置为不可调整大小
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout());
//文本框的创建及设置
txtShow.setFont(new Font("Times New Roman",Font.PLAIN,28));//字体设置
txtShow.setBackground(Color.WHITE); //白色背景
txtShow.setForeground(Color.BLUE); //蓝色文字
txtShow.setHorizontalAlignment(JTextField.RIGHT); //水平靠右
txtShow.setEnabled(false); //不可用
txtShow.setText("0"); //初始内容为“0”
handleNum = new HandleNumber(txtShow); //数字按钮处理
for(int i=0;i<=9;i++){
btnNumber[i] = new JButton(""+i);
btnNumber[i].addActionListener(handleNum);
}
//各按钮的创建
btnAdd = new JButton("+");
btnSub = new JButton("-");
btnMul = new JButton("*");
btnDiv = new JButton("/");
btnEql = new JButton("=");
btnPoint = new JButton(".");
btnClear = new JButton("C");
btnSign = new JButton("+/-");
btnExit = new JButton("关闭");
btnBS = new JButton("退格");
keyPane = new JPanel(new GridLayout(4,5,5,5)); //按钮键面板设计
keyPane.add(btnNumber[7]);
keyPane.add(btnNumber[8]);
keyPane.add(btnNumber[9]);
keyPane.add(btnDiv);
keyPane.add(btnExit);
keyPane.add(btnNumber[4]);
keyPane.add(btnNumber[5]);
keyPane.add(btnNumber[6]);
keyPane.add(btnMul);
keyPane.add(btnBS );
keyPane.add(btnNumber[1]);
keyPane.add(btnNumber[2]);
keyPane.add(btnNumber[3]);
keyPane.add(btnSub);
keyPane.add(btnClear);
keyPane.add(btnNumber[0]);
keyPane.add(btnSign);
keyPane.add(btnPoint);
keyPane.add(btnAdd);
keyPane.add(btnEql);
handleBack = new HandleBack(txtShow); //退格按钮处理
btnBS.addActionListener(handleBack);
handlePoint = new HandlePoint(txtShow,operator);//小数点按钮处理
btnPoint.addActionListener(handlePoint);
handleExit = new HandleExit();//关闭按钮处理
btnExit.addActionListener(handleExit);
handleC = new HandleC(txtShow,operator);//清空按钮处理
btnClear.addActionListener(handleC);
handleSign = new HandleSign(txtShow);//正负号处理
btnSign.addActionListener(handleSign);
handleEql = new HandleEql(txtShow,operator);
btnEql.addActionListener(handleEql);
contentPane.add(txtShow,BorderLayout.NORTH); //放置文本框
contentPane.add(keyPane,BorderLayout.CENTER); //放置按钮键面板
handleOP = new HandleOP(txtShow,operator);
btnAdd.addActionListener(handleOP);
btnSub.addActionListener(handleOP);
btnMul.addActionListener(handleOP);
btnDiv.addActionListener(handleOP);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible( true );
}
static boolean lastIsOperator(){
String s = lastClick;
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("="))
return true;
else
return false;
}
public static void main(String args[]){
new MainFrame("计算器");
}
}
HandleNumber.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class HandleNumber implements ActionListener {
JTextField txtShow;
HandleNumber(JTextField txt){
txtShow = txt;
}
public void actionPerformed(ActionEvent e) {
String num = e.getActionCommand();
String s = txtShow.getText();
if(MainFrame.lastIsOperator()){ //若刚刚点击过运算符
txtShow.setText(num); //文本框中重新显示点击数字
}
else{ //否则,即正在输入数字或清空、退格
if(s.equals("0")){ //若文本框中是0
txtShow.setText(num); //则用点击数字覆盖文本框内容
}
else
txtShow.setText(s+num); //否则在文本框内容后面附加点击数字
}
MainFrame.lastClick = e.getActionCommand(); //记录本次点击按钮
}
}
HandleOP.java
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class HandleOP implements ActionListener {
JTextField txtShow;
String operator[];
public HandleOP(JTextField txt,String[] op) {
txtShow = txt;
operator = op;
}
public void actionPerformed(ActionEvent e) {
//若运算符为空(即首次输入运算符),或刚刚点击过运算符
if(operator[1].equals("")||MainFrame.lastIsOperator()){
operator[0] = txtShow.getText(); //则提取文本框内容为操作数1
operator[1] = e.getActionCommand(); //记录本次点击运算符
}
else{ //进行计算
operator[2] = txtShow.getText(); //提取文本框内容为操作数2
String res = calculate(); //进行计算
txtShow.setText(res); //在文本框中显示结果
operator[0] = res; //将结果更新为操作数1
operator[1] = e.getActionCommand(); //记录运算符
}
MainFrame.lastClick = e.getActionCommand(); //记录刚刚点击的内容
}
String calculate(){
double x1,x2;
String result=null;
char op = operator[1].charAt(0);
x1 = Double.parseDouble(operator[0]);
x2 = Double.parseDouble(operator[2]);
switch(op){
case '+':
result = x1 + x2 + "";break;
case '-':
result = x1 - x2 + "";break;
case '*':
result = x1 * x2 + "";break;
case '/':
if(x2!=0)
result = x1/x2 + "";
else
result = "除数不能为零";
}
return result;
}
}
其余代码不再给出,如有需要请私信联系!!!