Java课程设计题目二:保存计算过程的计算器
1 设计要求
参考Windows 操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
①单击计算器上的数字按钮(0、1、2、3、4、5、6、7、8、9)可以设置参与计算的运算数。
②单击计算器上的运算符按钮(+、-、*、/)可以选择运算符号。
③单击计算器上的函数按钮可以计算出相应的函数值。
④单击计算器上的等号(=)按钮显示计算结果。
⑤在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
⑥单击“保存”按钮可以将文本区中显示的全部计算过程保存到文件;单击“复制”按钮可以将文本区中选中的文本复制到剪贴板;单击“清除”按钮可以清除文本区中的全部内容。
程序运行的参考效果图如图2.1所示。
图2.1运行效果
注意 按照 MVC-Model View Control(模型,视图,控制器)的设计思想展开程序的设计和代码的编写。数据模型部分相当于MVC 中的Model 角色,视图设计部分给出的界面部分相当于MVC 中的 View,视图设计部分给出的事件监视器相当于MVC 中的Control。
2数据模型
根据系统设计要求在数据模型部分编写了以下类。
·Computer 类:封装计算器的计算模型。
•MathComputer 接口:封装复杂的数学计算方法。
判断堆校是否还有数据,如果有数据返回alse,否则返回true.使用
puble E peek();
获取堆栈顶端的数据,但不删除该数据。
Compuuter.java
package ch2.data;
import java.util.*;
public class Computer {
public double result; //计算所得结果
public Stack<Character> dataItem; //参与运算的数据项
public Stack<Double> tempResult; //用堆栈存放临时结果
public Stack<Character> operator; //存放运算符号
public Computer(){
init();
}
public void init() {
dataItem = new Stack<Character>();
tempResult = new Stack<Double>();
dataItem.push('0');
operator = new Stack<Character>();
}
public void setDataItem(char c){
if(c!='.')
dataItem.push(c);
else {
if(!dataItem.contains('.'))
dataItem.push(c);
}
}
public void setOperator(char p){
if(dataItem.empty()){ //如果没有数据项
operator.clear();//防止用户不断更换或反复单击一个运算符
operator.push(p);//堆栈压入运算符,即保留用户最后确定的运算符
return;
}
if(operator.empty()) { //如果没有运算符
operator.push(p); //堆栈压入运算符
double m = computerDataItem(); //计算数据项
dataItem.removeAllElements(); //将数据项中的数字清空
tempResult.push(m); //把临时结果m压入tempResult
}
else { //如果有运算符
double mData = computerDataItem(); //计算数据项
dataItem.removeAllElements(); //将数据项中的数字清空
char yuansuan =operator.pop(); //弹出已有的运算符//
double rTemp =tempResult.pop(); //弹出临时结果
if(yuansuan == '+'){
rTemp = rTemp+mData;
}
else if(yuansuan == '-') {
rTemp = rTemp-mData;
}
else if(yuansuan == '*') {
rTemp = rTemp*mData;
}
else if(yuansuan == '/') {
rTemp = rTemp/mData;
}
tempResult.push(rTemp); //把新临时结果rTemp压入tempResult
operator.push(p); //新运算符压入operator
}
}
public char getOperator() {
if(operator.empty()){
return '\0';
}
return operator.peek();
}
public void backspace() {
if(dataItem.size()>=1){
dataItem.pop();
}
}
public void initDataItemByMath(MathComputer computer){
computer.handle(this); //对compter中的数据项进行数学计算
double rTemp =tempResult.pop();//弹出临时结果
if(yuansuan =='+'){
rTemp = rTemp+mData;
else if (yuansuan =='-'){
rTemp = rTemp-mData;
}else if (yuansuan =='*'){
rTemp = rTemp*mData;}
else if(yuansuan =='/'){
rTemp = rTemp/mData;}
tempResult.push(rTemp); //把新临时结果 rTemp 压入tempResult
operator.push(p); //把新运算符压入 operator
}
}
public char getOperator(){
if(operator.empty()){
return '\0';}
return operator.peek();}
public void backspace(){
if(dataItem.size()>=1){
dataltem.pop();}}
public void initDataItemByMath(MathComputer computer){
computer.handle(this); //对 computer 中的数据项进行数学计算
}public double getResult(){ //得到计算结果
double endItem = 0;
if(dataItem.empty()){
endItem = tempResult.peek();}
else {
endItem = computerDataltem();}
if(operator.empty())(
result = endItem;
return result;}
char yuansuan =operator.peek();//最后的运算符
if(yuansuan =’+’){
result = tempResult.peek()+endItem;
}
else if(yuansuan == '-') {
result = tempResult.peek()-endItem;
}
else if(yuansuan =='*') {
result = tempResult.peek()*endItem;
}
else if(yuansuan == '/') {
result = tempResult.peek()/endItem;
}
return result;
}
public double getTempResult() { //得到临时结果
double r = 0;
if(tempResult.empty()) {
r = computerDataItem();
}
else {
r= tempResult.peek();
}
return r;
}
public double computerDataItem(){ //计算出数据项的 double型结果
if(dataItem.empty()) {
return tempResult.peek();
}
StringBuffer str = new StringBuffer();
double doubleData = 0;
for(int i=0;i<dataItem.size();i++) {
str.append(dataItem.get(i));//获取堆栈中的数字 (但不弹栈)
}
try{
doubleData = Double.parseDouble(str.toString());
}
catch(NumberFormatException exp) {
doubleData = 0;
}
return doubleData;
}
}
2 数据处理相关类
1)MathComputer接口
在设计程序时应尽量将数据的存储和处理指派给不同的类,这样不仅便于程序的设计,更重要的是便于程序的后期维护。因为对计算机上的数据处理(对参与计算的数据项dataItem进行处理)会涉及求平方根、正弦等较为复杂的处理,甚至程序设计者无法预料用户将来会
按何种方式要求处理参与计算的数据项dataltem,所以首先设计一个顶层的MathComputer接口。MathComputer接口负责给出对数据模型进行操作的抽象方法,具体的实现由实现接的类负责,当用户的需求发生变化时(例如需要求cos的值),框架中只需增加一个实现追接口的类,例如Cos类,不必修改框架中的数据模型Computer类 。
MathComputer.java
package ch2.data;
public interface MathComputer{
public void handle(Computer data);
}
2)Sqt类
实现MathComputer接口,负责计算平方根。
Sqrt.java
package ch2.data;
public class Sqrt implements MathComputer{
public void handle(Computer data){
String s ="";
double r =data.computerDataItem();
r =Math.sqrt(r);
Double d =new Double(r);
long n =d.longvalue();//得到x整数部分
if(Math.abs(r-n)>0) //小数部分不是0
s=""+r;
else
s=""+n;//如果小数部分是0,省略小数
data.dataItem.removeAllElements();
for(int i=0;i<s.length();i++){
data.dataItem.push(s.charAt(i));
}
}
}
3)Reciprocal类
实现MathComputer接口,负责计算倒数。
Reciprocal.java
package ch2.data;
public class Reciprocal implements MathComputer{
public void handle(Computer data){
String s ="";
double r =data.computerDataItem();
r=1/r;
Double d =new Double(r);
1ongn=d.1ongVa1ue(); //得到r整数部分
if(Math.abs(r-n)>0) //小数部分不是 0S =""+r;
else
S =""+n; //如果小数部分是0,省略小数
data.dataItem.removeAllElements(); for(int i = 0;i<s.length();i++)(
data.dataItem.push(s.charAt(i));
4)PorN类
实现MathComputer接口,负责求负运算。
实现MathComputer接口,负责求负运算。
PorN.java
package ch2.data;
public class PorN implements MathComputer( public void handle(Computer data) String s="";
double r =data.computerDataItem();
x=-r;
Double d = new Double(r);
long n = d.longValue(); //得到x整数部分if(Math.abs(r-n)>0) //小数部分不是0
s =""+r;
else
S =""+n; //如果小数部分是 0,省略小数
data.dataItem.removeAllElements();
for(int i= 0;i<s.length();i++)(
data.dataItem.push(s.charAt(i));
}
}
}
按照源文件中的包语句将2.1节相关的Java源文件保存到以下目录中:D:\ch2\data
编译各个源文件,例如:
D:>javac ch2/data/Computer.java
也可以编译全部源文件:
D:>javac ch2/data/*.java
把2.2节给出的类看作一个小框架,那么Computer 类和 MathComputer 接口是核心部分,而实现 MathComputer 接口的类是可扩展部分,即可以根据用户的需求随时增加若干个实现MathComputer 接口的类。下面编写一个简单的应用程序,测试一下 2.2节给出的类,即在命令行表述对象的行为过程,如果表述成功(如果表述困难,说明数据模型不是很合理),那么就为以后的 GUI 程序设计提供了很好的对象功能测试,在后续的 GUI 设计中,重要的工作仅仅是为某些对象提供视图界面,并处理相应的界面事件而己。下面的用户程序用 2.2节
中给出的类计算了 (3+√15)/2。
将 AppTest.java 源文件按照包名保存到以下目录中:
D:lch2\test
编译源文件:
D:\›javac ch2/test/AppTest.java
运行 AppTest 类
D:\›javach2.test.AppTest
D:>javach2.teet.AppTest
TempResult=6.87298334620741:
Dataltem=2.0
result=3.4364916731037085
AppTest.java
图2.3 简单测试
package ch2. test;
import ch2.data.*;
public class Applest
public static void main (String [] args){
Computer com = new Computer () ,
com. setDataItem ('3') ;
com. setOperator ('+') ;
com. setDataltem('1'):
com. setDataItem ('5');
com. initDataItemByMath (new Sqrt());
com. setOperator('/");
com. setDataItem ('2');
System.out.println ("TempResult="+com.getTempResult () );
System.out.println ("Dataltem="+com. computerDataltem0);
System.out.println ("result="+com. getResult());
}
}
2.4 视图设计
设计 GUI 程序除了使用2.2 节给出的类以外,需要使用 javax.swing 包提供的视图(也称Java Swing 框架)以及处理视图上触发的界面事件。与2.3节中简单的测试相比,GUI 程序可以提供更好的用户界面,完成2.1节提出的设计要求。
GUI部分设计的类如下(主要类的UML图如图2.4所示)
CalculatorWindow
Computer:Computer
numberButton[]: JButton
operatorButton[]: JButton
initViewO:void
initActionListener():void()
Computer
dataltem:double
result:double
setDataltem(char C):void
HandleDigit
window:CalculatorWindow
showMess(:void
get(double r):String
actionPerformed(A ctionEvent e):void
图 2.4 主要类的 UML图
● CalculatorWindow 类:其实例为 Computer 类的实例提供外观显示。
● HandleEvent 类:实现 ActionListener 接口的类,封装了需要处理 ActionEvent 事件的
共用方法。
● HandleDigit 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击数
字按钮触发的 ActionEvent 事件。
● HandleBack 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击退
格按钮触发的 ActionEvent 事件。
● HandleClear 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击清
零按钮触发的 ActionEvent 事件。
● HandleEquation 类: HandleEvent 类的子类,其实例是一个监视器,负
责处理用户单
击等号按钮触发的 ActionEvent 事件。
● HandleFile 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击保
存按钮触发的 ActionEvent 事件。
● HandleOperator 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单
击运算符按钮触发的 ActionEvent 事件。
● HandlePN 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击正负号按钮触发的 ActionEvent 事件。
● HandleReciprocal 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击求倒数按钮触发的 ActionEvent 事件。
● HandleSqrt 类: HandleEvent 类的子类,其实例是一个监视器,负责处理用户单击求
平方根按钮触发的 ActinnEvent 事件。
1.视图相关类
视图提供更加友好的交互界面,以便完成设计的有关要求,例如将用户输入的数字、
计算结果以及计算过程显示在视图中。按照2.1节的设计要求编写以下 CalculatorWindow 类( JFrame 的子类)。CalculatorWindow 类主要是为2.2节中的 computer 类提供视图(效果如图2.1所示),因此 CalculatorWindow 类需要组合 Computer 类的对象。
CalculatorWindow.java
Package ch2.view;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import ch2.data.*;
public class CalculatorWindow extends JFrame {
Computer computer; //需要提供视图的对象
JButton numberButton[]; //数字按钮
JButton operatorButton[]; //加、减、乘、除按钮
JButton dot,p0Rn,back,equation,clear; //小数点、正负号、退格、等号和清零按钮
JButton sqrt,reciprocal; //求平方根、求倒数按钮
JTextField resultShow; //显示计算结果
JTextField showTempResult; //显示当前计算过程的临时结果
JLabel showTempResult; //显示运算符号
JTextField showDataItem; //显示当前参与运算的数据项
JTextArea saveComputerProcess; //显示计算步骤
JButton saveButton,copyButton,clearTextButton;//保存计算过程等按钮
public CalculatorWindow() {
computer = new Computer();
initView(); //设置界面
initActionListener(); //注册监视器
}
Public void initView() {
setTitle(“计算器”);
JPanel panelLeft,panelRight;
resultShow=new JTextField(10);
resultShow.setHorizontalAlignment(JTextField.LEFT);
resultShow.setForeground(Color.blue);
resultShow.setFont(new Font(“TimesRoman”,Font.BOLD,14));
resultShow.setEditable(false);
resultShow.setBackground(Color.green);
showTempResult=new JTextField();
showTempResult.setHorizontalAlignment(JTextField.RIGHT);
showTempResult.setFont(new Font(“Arial”,Font.BOLD,14));
showTempResult.setBackground(Color.cyan);
showTempResult.setEditable(false);
showOperator = new JTabel();
showOperator.setBackground(Color.pink);
showOperator.setFont(new Font(“Arial”,Font.BOLD,18));
showOperator.setHorizontalAlignment(JTextField,CENTER);
showDataltem = new JTextField();
showDataltem.setBackground(Color.white);
showDataltem.setHorizontalAlignment(JTextField.LEFT);
showDataItem.setFont (new Font("Arial",Font.BOLD,14));showDataItem.setEditable(false);
saveComputerProcess=new JTextArea();
saveComputerProcess.setEditable(false);
saveComputerProcess.setFont(new Font("宋体”,Font,PLAIN,14));numberButton=new JButton[10];
for(int i=0;i<=9;i++)(
numberButton[i]=new JButton(""+i);
numberButton [1].setFont (new Font(“Arial”,Font.BOLD,20));
operatorButton=new JButton [4];
String 运算符号[]=(”+” ”*”。"/”)
for(int i=0;i<4;i++)(
operatorButton[i]=new JButton(运算符号(i1);
operatorButton[i].setFont (new Font("Arial",Font.BOLD,20));
dot=new JButton(".");
pOrN=new JButton("+/-");
equation=new JButton("=");
back= new JButton("退格”);
clear = new JButton("C");
sqrt=new JButton("sqrt");
reciprocal=new JButton("1/x");
saveButton=new JButton("保存");
copyButton=new JButton("复制");
clearTextButton=new JButton("清除”);
panelLeft=new JPanel(); //开始布局,创建布局需要的容器panelRight=new JPanel();
panelLeft.setLayout(new BorderLayout());
JPanel centerInLeft=new JPanel();
Box boxH=Box.createHorizontalBox();
boxH.add(showTempResult);
boxH.add(showoperator) ;
boxH.add(showDataItem);
panelLeft.add(boxH,BorderLayout.NORTH);
panelLeft.add(centerInLeft,BorderLayout.CENTER);
centerInLeft.setLayout(new GridLayout(5,5));
centerInLeft.add(numberButton[1]); //布局的第1行centerInLeft.add(numberButton[2]) ;
centerInLeft.add(numberButton[3]);
centerInLeft.add(operatorButton[0]);
centerInLeft.add(back);
centerInLeft.add(numberButton[4]); //布局的第2行centerInLeft.add(numberButton[5]);
centerInLeft.add(numberButton[6]);
centerInLeft.add(operatorButton[1]);
centerInLeft.add(clear);
centerInLeft.add(numberButton[7]); //第3行
centerInLeft.add(numberButton[8]);
centerInLeft.add(numberButton[9]);
centerInLeft.add(operatorButton[2]);
centerInLeft.add(reciprocal);
centerInLeft.add(numberButton[0]); //第4行
centerInLeft.add(pOrN);
centerInLeft.add(dot);
centerInLeft.add(operatorButton[3]);
centerInLeft.add(sqrt);
centerInLeft.add(new JLabel()); //第5行
centerInLeft.add(new JLabel());
centerInLeft.add(new JLabel());
centerInLeft.add(newJLabel());
centerInLeft.add(equation);
panelRight.setLayout (new BorderLayout ());
panelRight.add(resultShow, BorderLayout.NORTH);
panelRight.add(newJScrollPane(saveComputerProcess),BorderLayout.CENTER);
JPanel southInPanelRight=new JPanel();
southInPanelRight.add(saveButton);
southInPanelRight.add(copyButton);
southInPanelRight.add(clearTextButton);
panelRight.add(southInPanelRight,BorderLayout.SOUTH);
JSplitPane split=new JSplitPane
soutnInraneIRight.add(copyButton);
southInPanelRight.add(clearTextButton);
panelRight.add(southInPanelRight,BorderLayout.SOUTH);
JSplitPane split=new JSplitpane
(JSplitPane.HORIZONTAL_SPLIT,panelLeft,panelRight);add(split, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setBounds(100,50, 888,258);
validate();
}
public void initActionListener(){
HandleDigit handleDigit = new HandleDigit(this);
for(int i=0;i<=9;i++){
numberButton[i].addActionListener(handleDigit);//为数字按钮注册监视器
}
dot.addActionListener(handleDigit);
HandleOperator handleOperator = new HandleOperator(this);
for(int i=0;i<4;i++){
operatorButton[i].addActionListener (handleOperator);
}
pOrN.addActionListener(new HandlePN(this));
sqrt.addActionListener(new HandleSqrt(this));
reciprocal.addActionListener(new HandleReciprocal (this));
back.addActionListener (new HandleBack (this));
equation. addActionListener (new HandleEquation (this));clear.addActionListener (new HandleClear (this));
HandleFile handleFile = new HandleFile (this);
saveButton,addActionListener (handleFile) ;
copyButton. addActionListener (handleFile);
clearTextButton. addActionListener (handleFile);
}
}
❷事件监视器
事件监视器负责处理在视图上触发的用户界面事件,以便完成相应的任务。
- HandleEvent类
由于监视器处理事件时有许多共同的操作,因此编写–个实现ActionListener接口的HandleEvent类,其他监视器只要是HandleEvent 的子类,子类根据各自的需要重写ActionListener接口中的方法即可。
HandleEvent.java
package ch2. view;
import java.awt.event. *;
public class HandleEvent implements ActionListener {CalculatorWindow window;
HandleEvent (CalculatorWindow window) {
this . window=window;
public void showMess() {
window. resultShow. setText(" = "+get (window . computer . getResult()));window . showTempResult. setText (get (window . computer . getTempResult())+"");wi ndow. showOperator . setText(" "+window . computer . getOperator()+" ");window . showDataItem. setText (" "+get (window . computer . computerDataItem()));
public string get (double r) {//返回浮点数的串表示,如果小数部分是0,省略小数String s="";
Double d = new Double(r) ;
long n = d. longValue();//得到r整数部分
if (Math.abs(r-n)>0)
else
s =+n;
return S ;
public void actionPerformed (ActionEvent e){}
- HandleDigit 类
HandleDigit 的实例负责监视CalculatorWindow 视图中的数字按钮,即numberButton 数 - HandleReciprocal 类
HandleReciprocal 的实例负责监视 CalculatorWindow 视图中的求倒数按钮,
HandleReciprocal.java
package ch2.view;
import java.awt.event.*;
import ch2.data.Reciprocal;
public class HandleReciprocal extends HandleEvent{
HandleReciprocal(CalculatorWindow window){
super(window);
}
public void actionPerformed(ActionEvent e){
window.computer.initDataItemByMath(new Reciprocal());
showMess();
- HandleSqrt类
HandleSqrt 的实例负责监视 CalculatorWindow 视图中的求平方根按钮。
HandleSqrt.java
package ch2.view;
import java.awt.event.*;
import ch2.data.Sqrt;
public class HandleSgrt extends HandleEvent{
HandleSqrt(CalculatorWindow window){
super(window);
}
public void actionPerformed(ActionEvent e){
window.computer.initDataItemByMath(new Sqrt());
showMess();
}
}
6)HandlePN 类
HandlePN的实例负责监视 CalculatorWindow 视图中的正负按钮。
HandlePN.java
package ch2.view;
import java awt.event.*;
import ch2.data.PorN;
public class HandlePN extends HandleEvent{
HandlePN(CalculatorWindow window){
super(window);
}
public void actionPerformed(ActionEvent e){
window.computer.initDataItemByMath(new PorN());
showMess();
}
}
7)HandleBack类
HandleBack的实例负责监视CalculatorWindow视图中的退格按钮。
HandleBack.java
package ch2.view;
import java.awt.event.*;
public class HandleBack extends HandleEvent{
HandleBack(CalculatorWindow window){
super(window);
}
public void actionPerformed(ActionEvent e) {
window.computer.backspace();
showMess();
}
}
8)HandleClear类
HandleClear的实例负责监视CalculatorWindow视图中的清零按钮。
HandleClear.java
package ch2.view;
import java.awt.event.*;
public class HandleClear extends HandleEvent{
HandleClear(CalculatorWindow window){
super(window);
}
public void actionPerformed(ActionEvent e){
window.computer.init();
showMess();
}
}
9)HandleEquation类
HandleEquation的实例负责监视CalculatorWindow视图中的等号按钮。
HandleEquation.java
package ch2.view;
import java.awt.event.*;
public class HandleEquation extends HandleEvent{
HandleEquation (CalculatorWindow window){
super (window) ;
}
public void actionPerformed (ActionEvent e) {
String mess=" "+window. computer.getTempResult ()+" " +
window.computer.getOperator () +" "+
window. computer.computerDataItem () +"=" +
window. computer. getResult();
window. saveComputerProcess.append (" \n"+mess) ;
}
}
- HandleFile 类
HandleFile的实例负责监视 CalculatorWindow 视图中的保存、复制和清除按钮
HandleFile.java
package ch2.view:
import java.awt . event.*;
import java .io.*;
import javax.swing.JFileChooser;
public class HandleFile extends HandleEvent{
HandleFile (CalculatorWindow window)
{
super (window);
}
public void actionPerformed (ActionEvent e) {
if (e.getSource ()==window. copyButton)
window. savecomputerProcess.copy();//复制选中的文本
if(e.getSource()==window.clearTextButton)
window.saveComputerProcess.setText (null) ;
if(e.getSource () ==window. saveButton) {
JFileChooser chooser=new JFileChooser () ;
int state=chooser. showSaveDialog (null) ;
File file=chooser.getSelectedFile();
if(file!=null&&state==JFileChooser.APPROVE _ OPTION) {
try{String content=window.saveComputerProcess.getText();
StringReader read=new StringReader (content) ;BufferedReader in=
new BufferedReader (read) ;
FileWriter outOne=new FileWriter (file) ;
BufferedWriter
out= new BufferedWriter (outOne) ;
String str=null;
while ( (str=in.readline())!=null){
out.write (str);
out. newline);
}
in.close();
out.close()
};
catch(IOException e1) {}
}
}
}
}
2.5 GUI 程序
按照源文件中的包语句将2.4节中相关的源文件保存到以下目录中:
D: \ch2\view\
编译各个源文件,例如:
D: >javac ch2/view/Calculatorwindow.java
也可以编译全部源文件:
D: >javac ch2/view/*. java
把2.2节和2.4节给出的类看作一个小框架,下面用框架中的类编写GUI应用程序,完成2.1节给出的设计要求。
将AppWindow.java源文件按照包名保存到以下目录中:
D: \ch2\gui
编译源文件:
D: >javac ch2/gui/AppWindow.java
运行AppWindow类(运行效果如本章开始给出的图2.1) :头推文005海D:>java ch2 .gui .AppWindow
AppWindow,java
package ch2.gui;
import ch2. view. CalculatorWindow;
public class AppWindow{
public static void main(String [] args) {
CalculatorWindow win - new Calculatorwindow();
}
}
2.6程序发布
用户可以使用jarexe命令制作JAR文件来发布软件。
①清单文件
编写以下清单文件(用记事本保存时需要将保存类型选择为“所有文件(.)”):
ch2.mf
Manifest-Version:1.0
Main-Class: ch2.gui.AppWindow
Created-By:1.8
将ch2.mf保存到D\:,即保存在包名所代表的目录的上一层目录中。
注意 清单中的 Manifest-Version和 1.0之间、Main-Class 和主类ch2.gui.AppWindow之间以及Created-By 和1.8之间必须有且只有一个空格。
2用批处理文件发布程序
在命令行中使用jar命令得到JAR文件:
D:>jar cfmCalculator.jar ch2.mf ch2/data/.class ch2/view/.class ch2/gui/
.class
其中,参数c表示要生成一个新的JAR文件,f表示要生成的JAR文件的名字,m表示清单文件的名字。如果没有任何错误提示,在D:\下将产生一个名字是Calculatorjar的文件。
编写以下 calculator.bat,用记事本保存该文件时需要将保存类型选择为“所有文件(+.)”。
calculator.bat
path.\jre\bin
pause
javaw -jar Calculator.jar
将该文件保存到自己命名的某个文件夹中,例如名字是2000的文件夹中。然后将 Calculator.jar 和 JRE(即调试程序使用的JDK安装目录下的JRE子目录)复制到2000文件夹中。在2000文件夹中再保存一个软件运行说明书,提示双击calculator.bat 即可运行程序。
可以将2000文件夹作为软件发布,也可以用压缩工具将2000文件夹下的所有文件压缩成.zip 或.jar文件发布。用户解压后双击 calculator.bat 即可运行程序。
如果客户计算机上肯定有JRE,可以不把JRE复制到2000文件夹中,同时去除.bat文件中的“path.jre\bin”内容。
2.7 课设题目
保存计算过程的计算器
在学习本章代码的基础上改进程序的功能,可以为程序增加任何合理的并有能力完成的功能,但至少要增加下列所要求的功能。
- 在保存计算过程到文件的同时也把当前时间保存到该文件。
2、参考《Java 2 实用教程》第5版的9.8节,实现将按钮绑定到键盘。
3、增加音乐效果,用户单击按钮时程序能播放简短的声音,让用户通过声音知道自己单击了怎样的按钮(是否打开音效用户可以选择,参见第8章中的ch8.view.PlayMuisc类)。
4、可以让用户选择计算器精度,例如小数点最多保留两位等。
5、计算器用BigInteger类(参见《Java 2实用教程》第五版的8.7节)计算阶乘。 - 自定义题目
通过老师指导或直接查找资料自创一个题目,例如针对某些行业的特殊计算器。
代码链接:
链接:https://pan.baidu.com/s/1NKf6QZAm30Dr525M18pNrw?pwd=0000
提取码:0000