Java面向对象编程
实验报告
题 目:数组与图形化界面
专 业:
班 级:
学 号:
姓 名:
太原工业学院计算机工程系
年 月 日
一、实验目的与要求
1、掌握Java编程中的数组的应用
2、掌握Java GUI编程的应用以及API的查阅
3、掌握Java GUI 窗体容器、布局管理器、基本组件、事件的注册
实验内容
Java GUI实现如下图简单计算器
三、实施步骤
1. 创建类CalculatorDemo ,继承JFrame
package abc;
import java.awt.BorderLayout;
import java.awt.GridLayout;
importjava.awt.event.ActionListener;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
publicclass CalculatorDemoextends JFrame{
/*结果输入框*/
private JTextField result;
/*操作键之前缓存*/
private StringBuilder beforeCache = new StringBuilder();
/*操作键之后缓存*/
private StringBuilder afterCache = new StringBuilder();
/*清除键*/
private JButton clean;
/*数字键*/
private JButton[] numberButs = new JButton[10];
/*操作键*/
private Map<String,JButton> operKeyMap = new HashMap<String,JButton>();
/*操作标识*/
privateboolean operFlag = false;
publicvoid setOperFlag(boolean operFlag) {
this.operFlag = operFlag;
}
public CalculatorDemo(){
initComp();
initMainWindow();
addListenerHandler();
}
/*初始化组件*/
privatevoid initComp(){
/*清除按钮初始化*/
clean = new JButton("清除");
/*结果按钮初始化*/
result= new JTextField(10);
/*数字键初始化*/
for(int i=0;i<10;i++){
numberButs[i]=new JButton(""+i);
}
/*操作键的初始化*/
operKeyMap.put("jia", new JButton("+"));
operKeyMap.put("jian", new JButton("-"));
operKeyMap.put("chen", new JButton("*"));
operKeyMap.put("dengyu", new JButton("="));
operKeyMap.put("dian", new JButton("."));
operKeyMap.put("chu", new JButton("/"));
}
/**
* 初始化Main窗体
* **/
privatevoid initMainWindow(){
this.setSize(300, 300);
this.setLocation(350, 350);
this.add(result,BorderLayout.NORTH);
JPanel keyPanle = new JPanel();
//设置JPanel的布局(GridLayout)
GridLayout gl = new GridLayout(4,4);
keyPanle.setLayout(gl);
keyPanle.add(numberButs[7]);
keyPanle.add(numberButs[8]);
keyPanle.add(numberButs[9]);
keyPanle.add(operKeyMap.get("chu"));
keyPanle.add(numberButs[4]);
keyPanle.add(numberButs[5]);
keyPanle.add(numberButs[6]);
keyPanle.add(operKeyMap.get("chen"));
keyPanle.add(numberButs[1]);
keyPanle.add(numberButs[2]);
keyPanle.add(numberButs[3]);
keyPanle.add(operKeyMap.get("jian"));
keyPanle.add(numberButs[0]);
keyPanle.add(operKeyMap.get("dian"));
keyPanle.add(operKeyMap.get("jia"));
keyPanle.add(operKeyMap.get("dengyu"));
this.add(clean,BorderLayout.CENTER);
this.add(keyPanle,BorderLayout.SOUTH);
this.setVisible(true);
}
/**
* 注册事件监听
* **/
privatevoid addListenerHandler(){
/*主窗体事件处理*/
this.addWindowListener(new MainWindowListenerImpl());
/*清除按钮事件处理*/
clean.addMouseListener(new MouseListenerImpl());
clean.addActionListener(new CleanButtonActionListenerImpl(this));
/*数字键事件处理*/
for(JButton numBut:numberButs){
numBut.addMouseListener(new MouseListenerImpl());
numBut.addActionListener(new NumKeyActionListenerImpl(this));
}
/*操作键事件处理*/
Collection<JButton> operButtons= operKeyMap.values();
for(JButton operBut:operButtons){
operBut.addMouseListener(new MouseListenerImpl());
operBut.addActionListener(new OperKeyActionListenerImpl(this));
}
}
/*入口*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
new CalculatorDemo();
}
public JTextField getResult() {
return result;
}
public StringBuilder getBeforeCache() {
return beforeCache;
}
public StringBuilder getAfterCache() {
return afterCache;
}
public JButton getClean() {
return clean;
}
public JButton[] getNumberButs() {
return numberButs;
}
public Map<String, JButton> getOperKeyMap() {
return operKeyMap;
}
publicboolean isOperFlag() {
return operFlag;
}
}
2.新建类 CleanButtonActionListenerImpl,在类的基础上建立接口ActionListener
package abc;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
publicclass CleanButtonActionListenerImpl implements ActionListener {
private CalculatorDemo cal;
public CleanButtonActionListenerImpl(CalculatorDemo c){
this.cal = c;
}
@Override
publicvoid actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JTextField result = cal.getResult();
/*获取输入文本*/
String resultText= result.getText();
if(!resultText.equals("")){
//文本內容,重置為空
result.setText("");
//緩存清空
StringBuilder beforeCache = cal.getBeforeCache();
StringBuilder afterCache = cal.getAfterCache();
beforeCache.delete(0, beforeCache.length());
afterCache.delete(0, afterCache.length());
cal.setOperFlag(false);
}
}
}
3. 新建类 MainWindowListenerImpl,在类的基础上建立接口WindowListener
package abc;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
publicclass MainWindowListenerImpl implements WindowListener {
@Override
publicvoid windowActivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid windowClosed(WindowEvent arg0) {
// TODO Auto-generated method stub
}
/***
* 当主窗体关闭时,推出整个程序
* */
@Override
publicvoid windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.println("退出计算器程序");
System.exit(0);
}
@Override
publicvoid windowDeactivated(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid windowDeiconified(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid windowIconified(WindowEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid windowOpened(WindowEvent arg0) {
// TODO Auto-generated method stub
System.out.print("窗体打开");
}
}
4. 新建类 MouseListenerImpl,在类的基础上建立接口MouseListener
package abc;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventObject;
import javax.swing.JButton;
publicclass MouseListenerImpl implements MouseListener {
private EventObject event;
@Override
publicvoid mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid mouseEntered(MouseEvent event) {
// TODO Auto-generated method stub
JButton bt = (JButton)event.getSource();
bt.setForeground(Color.RED);
}
@Override
publicvoid mouseExited(MouseEvent event) {
// TODO Auto-generated method stub
JButton bt = (JButton)event.getSource();
bt.setForeground(Color.BLACK);
}
@Override
publicvoid mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
publicvoid mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
5.新建类 NumKeyActionListenerImpl,在类的基础上建立接口ActionListener
package abc;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
importjava.util.EventObject;
import javax.swing.JButton;
importjavax.swing.JTextField;
publicclass NumKeyActionListenerImpl implements ActionListener {
private CalculatorDemo cal;
public NumKeyActionListenerImpl(CalculatorDemo c){
this.cal = c;
}
@Override
publicvoid actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
/*获取当前操作的数字键对象*/
JButton but =(JButton)event.getSource();
/*
* 1.在没有按下操作键之前,
* 所有的数字键的值被缓存到beforeCache
*显示到输入框中
*/
/*获取数字键对应的输入值*/
String numVaue=but.getText();
if(!cal.isOperFlag()){
cal.getBeforeCache().append(numVaue);
cal.getResult().setText(cal.getBeforeCache().toString());
}else{
cal.getAfterCache().append(numVaue);
cal.getResult().setText(cal.getAfterCache().toString());
}
}
}
6. 新建类 OperKeyActionListenerImpl,在类的基础上建立接口ActionListener
package abc;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
importjava.util.EventObject;
import javax.swing.JButton;
importjavax.swing.JTextField;
publicclass OperKeyActionListenerImpl implements ActionListener {
private CalculatorDemo cal;
public OperKeyActionListenerImpl(CalculatorDemo c){
this.cal = c;
}
/* 如果按下操作键盘,依据操作键表示的操作类型,执行相关的计算
计算步骤:1>取得操作键之前的缓存输入
2>获取操作键之后的数字键输入
3>获取相关操作类型,执行计算
*/
@Override
publicvoid actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
/*获取操作键*/
JButton but = (JButton)event.getSource();
//置空结果显示
cal.getResult().setText("");
cal.setOperFlag(true);
}
}
四、实验结果
五、出现的问题及解决的方法