Java课程设计题目二:保存计算过程的计算器

Java课程设计题目二:保存计算过程的计算器

1 设计要求

参考Windows 操作系统提供的计算器设计一个实用的计算器,要求除了具有普通的计算功能外,还具有保存计算过程的功能。
①单击计算器上的数字按钮(0、1、2、3、4、5、6、7、8、9)可以设置参与计算的运算数。
②单击计算器上的运算符按钮(+、-、*、/)可以选择运算符号。
③单击计算器上的函数按钮可以计算出相应的函数值。
④单击计算器上的等号(=)按钮显示计算结果。
⑤在一个文本框中显示当前的计算过程,在一个文本区中显示以往的计算过程。
⑥单击“保存”按钮可以将文本区中显示的全部计算过程保存到文件;单击“复制”按钮可以将文本区中选中的文本复制到剪贴板;单击“清除”按钮可以清除文本区中的全部内容。
程序运行的参考效果图如图2.1所示。
在这里插入图片图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("宋体”,FontPLAIN14));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);
 }
}

❷事件监视器

事件监视器负责处理在视图上触发的用户界面事件,以便完成相应的任务。

  1. 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){}
  1. HandleDigit 类
    HandleDigit 的实例负责监视CalculatorWindow 视图中的数字按钮,即numberButton 数
  2. 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();
  1. 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) ;
}
}
  1. 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
  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟-宇的个人博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值