⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expressionframe.java

📁 1.用堆栈实现表达式求值 2.随机生成带括号的表达式
💻 JAVA
字号:
/**
 * 
 */
package sasa.view;

import java.net.URL;
import java.net.URLClassLoader;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import java.awt.Rectangle;
import javax.swing.JTextField;
import sasa.service.*;
import sasa.domain.ExpressionBean;
import java.util.ArrayList;
import java.util.List;

/**
 * @author sasa
 * 
 * @version 1.0 2007-4-26 上午09:30:50
 */
public class ExpressionFrame extends JFrame {

	private static final long serialVersionUID = 1L;
	
	private Dimension screenSize = null;	//屏幕大小  //  @jve:decl-index=0:
	
	private List<ExpressionBean> list = new ArrayList<ExpressionBean>() ;	//保存用户回答信息  //  @jve:decl-index=0:
	
	private ExpressionBean exBean= null;	//表达式信息bean

	private ExpressionDeal ex = new ExpressionDeal(); // 表达式求值  //  @jve:decl-index=0:

	private ExpressionRandom ran = new ExpressionRandom(); // 随机生成表达式 //  //  @jve:decl-index=0:
															// @jve:decl-index=0:

	private int sum = 0; // 完成题目个数

	private int allRight = 0; // 答对题目个数

	private JPanel jContentPane = null; // 主面板

	private JPanel top = null; // 上部面板

	private JPanel right = null; // 右部面板

	private JPanel center = null; // 中间面板

	private JButton help = null; // 帮助按钮

	private JButton about = null; // 关于按钮

	private JButton start = null; // 开始按钮

	private TimeRecord timeRecord = null; // 计时

	private JButton exit = null; // 退出按钮

	private Border border = new BevelBorder(BevelBorder.RAISED); // 设置主边框

	private JTextField src = null; // 输入表达式

	private JLabel des1 = null; // 文字描述

	private JButton sure = null; // 计算按钮

	private JLabel value = null; // 表达式值

	private JLabel src1 = null; // 随机生成表达式

	private JButton good = null; // 完成按钮

	private JLabel des2 = null; // 文字描述

	private JTextField value1 = null; // 输入答案

	private JButton next = null; // 下一题按钮

	private JLabel num = null;	//显示题目个数

	/**
	 * This is the default constructor
	 */
	public ExpressionFrame() { // 空构造方法
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() { // 初始化框架
		Dimension frameSize = new Dimension(400, 300);
		this.setSize(frameSize);	//设置大小
		try{
			//设置程序的外观为当前操作系统外观
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}catch(Exception e){
			throw new RuntimeException(e);
		}
		this.setContentPane(getJContentPane());
		this.setTitle("表达式求解");	//设置标题
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setIconImage(getImage("images/myhead.png"));	//设置程序图标
		this.setResizable(false);	//不能改变窗体大小
		screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((int)(screenSize.width - frameSize.getWidth())/2, (int)(screenSize.height - frameSize.getHeight())/2);
		
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getTop(), BorderLayout.NORTH);
			jContentPane.add(getRight(), BorderLayout.EAST);
			jContentPane.add(getCenter(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * 通过给定的文件名获得图像
	 * 
	 * @param filename
	 *            给定图像的文件名
	 * @return 图像
	 */
	Image getImage(String filename) {
		URLClassLoader urlLoader = (URLClassLoader) this.getClass()
				.getClassLoader();
		URL url = null;
		Image image = null;
		url = urlLoader.findResource(filename);
		image = Toolkit.getDefaultToolkit().getImage(url);
		MediaTracker mediatracker = new MediaTracker(this);
		try {
			mediatracker.addImage(image, 0);
			mediatracker.waitForID(0);
		} catch (InterruptedException _ex) {
			image = null;
		}
		if (mediatracker.isErrorID(0)) {
			image = null;
		}

		return image;
	}

	/**
	 * This method initializes top
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getTop() {
		if (top == null) {
			top = new JPanel();
			top.setPreferredSize(new Dimension(300, 45));
			top.setLayout(new FlowLayout(FlowLayout.LEFT));
			top.setBorder(border);
			top.add(getHelp(), null);
			top.add(getAbout(), null);
		}
		return top;
	}

	/**
	 * This method initializes right
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getRight() {
		if (right == null) {
			timeRecord = new TimeRecord();
			// timeRecord.setText("timestart");
			timeRecord.setBounds(new Rectangle(25, 96, 52, 18));
			right = new JPanel();
			right.setPreferredSize(new Dimension(100, 35));
			right.setLayout(null);
			right.setBorder(border);
			right.add(getStart(), null);
			right.add(timeRecord, null);
			right.add(getExit(), null);
		}
		return right;
	}

	/**
	 * This method initializes center
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getCenter() {
		if (center == null) {
			num = new JLabel();
			num.setBounds(new Rectangle(40, 97, 54, 18));
			num.setText("");
			des2 = new JLabel();
			des2.setBounds(new Rectangle(26, 135, 256, 18));
			des2.setText("请输入结果(小数点后保留两位有效数字):");
			des2.setVisible(false);
			src1 = new JLabel();
			src1.setBounds(new Rectangle(98, 97, 147, 18));
			src1.setText("");
			value = new JLabel();
			value.setBounds(new Rectangle(14, 47, 170, 18));
			value.setText("");
			des1 = new JLabel();
			des1.setBounds(new Rectangle(14, 19, 93, 18));
			des1.setText("请输入表达式:");
			center = new JPanel();
			center.setLayout(null);
			center.setBorder(border);
			center.add(getSrc(), null);
			center.add(des1, null);
			center.add(getSure(), null);
			center.add(value, null);
			center.add(src1, null);
			center.add(des2, null);
			getValue1().setVisible(false); // 设置为不可见
			center.add(getValue1(), null);
			getNext().setVisible(false); // 设置为不可见
			center.add(getNext(), null);
			getGood().setVisible(false); // 设置为不可见
			center.add(getGood(), null);
			center.add(num, null);
		}
		return center;
	}

	/**
	 * This method initializes help
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getHelp() {
		if (help == null) {
			help = new JButton();
		}
		help.setText("帮助");
		help.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				new HelpDialog(ExpressionFrame.this).setVisible(true);
			}
		});
		return help;
	}

	/**
	 * This method initializes about
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getAbout() {
		if (about == null) {
			about = new JButton();
		}
		about.setText("关于");
		about.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
				//ExpressionFrame.this.setVisible(false);
				new AboutDialog(ExpressionFrame.this).setVisible(true);
			}
		});
		return about;
	}

	/**
	 * This method initializes start
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getStart() {
		if (start == null) {
			start = new JButton();
			start.setText("测试");
			start.setBounds(new Rectangle(22, 51, 60, 28));
			start.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					timeRecord.start();	//计时开始
					num.setText("第1题:");
					num.setVisible(true);
					src1.setText(ran.randomString(100));
					des2.setVisible(true);
					src1.setVisible(true);
					getValue1().setVisible(true);
					getNext().setVisible(true);
					getGood().setVisible(true);
					sum = 1;
				}
			});
		}
		return start;
	}

	/**
	 * This method initializes exit
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getExit() {
		if (exit == null) {
			exit = new JButton();
			exit.setText("退出");
			exit.setBounds(new Rectangle(21, 168, 60, 28));
			exit.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					ExpressionFrame.this.dispose();
					System.exit(0);
				}
			});
		}
		return exit;
	}

	/**
	 * This method initializes src
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getSrc() {
		if (src == null) {
			src = new JTextField(20);
			src.setBounds(new Rectangle(126, 18, 146, 22));
		}
		return src;
	}

	/**
	 * This method initializes sure
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getSure() {
		if (sure == null) {
			sure = new JButton();
			sure.setText("计算");
			sure.setBounds(new Rectangle(215, 44, 60, 28));
			sure.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					String strSrc = src.getText();
					if (strSrc.equals(""))
						JOptionPane.showMessageDialog(null, "请输入表达式!", "错误",
								JOptionPane.ERROR_MESSAGE);
					else {
						try {
							float fltValue = ex.evaluateExpression(strSrc);
							if(ex.getMessage()!=null)
								JOptionPane.showMessageDialog(null, ex.getMessage(), "错误",
										JOptionPane.ERROR_MESSAGE);
							else if (fltValue == (int) fltValue)
								value.setText("结果为:"
										+ String.valueOf((int) fltValue));
							else
								value
										.setText("结果为:"
												+ String.valueOf(fltValue));
						} catch (Exception exc) {
						}
					}
					ex.setMessage(null);
				}
			});

		}
		return sure;
	}

	/**
	 * This method initializes good
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getGood() {
		if (good == null) {
			good = new JButton();
			good.setText("查看测试结果");
			good.setBounds(new Rectangle(24, 194, 135, 28));
			good.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if(value1.getText().equals("")||!ex.isNum(value1.getText()))
						JOptionPane.showMessageDialog(null, "您输入的答案为空或含非法字符!","错误",JOptionPane.ERROR_MESSAGE);
					else{
						try{
						exBean = new ExpressionBean();
						exBean.setSrc(num.getText() + src1.getText());	//随机表达式
						exBean.setValue(ex.userEvaluate(src1.getText()));	//系统计算答案
						exBean.setUserValue(Float.valueOf(value1.getText()));	//用户答案
						if(exBean.getValue()==exBean.getUserValue()){
							exBean.setMessage("√");
							allRight++;	//正确个数加1
						}
						else
							exBean.setMessage("×");
						list.add(exBean);
						}catch(Exception exp){};
						timeRecord.stop();	//停止计时
						new ExpressionDialog(ExpressionFrame.this).setVisible(true);//此处显示消息框
						src1.setVisible(false);
						getValue1().setText("");
						getValue1().setVisible(false);
						des2.setVisible(false);
						num.setVisible(false);
						getNext().setVisible(false);
						getGood().setVisible(false);
						list.clear();	//清空list以便保存再次测试记录
					}
				}
			});
		}
		return good;
	}

	/**
	 * This method initializes value1
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getValue1() {
		if (value1 == null) {
			value1 = new JTextField();
			value1.setBounds(new Rectangle(26, 164, 99, 22));
		}
		return value1;
	}

	/**
	 * This method initializes next
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getNext() {
		if (next == null) {
			next = new JButton();
			next.setBounds(new Rectangle(139, 160, 85, 28));
			next.setText("下一题");
			next.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if(value1.getText().equals("")||!ex.isNum(value1.getText()))
						JOptionPane.showMessageDialog(null, "您输入的答案为空或含非法字符!","错误",JOptionPane.ERROR_MESSAGE);
					else{
						try{
						exBean = new ExpressionBean();
						exBean.setSrc(num.getText() + src1.getText());	//随机表达式
						exBean.setValue(ex.userEvaluate(src1.getText()));	//系统计算答案
						exBean.setUserValue(Float.valueOf(value1.getText()));	//用户答案
						if(exBean.getValue()==exBean.getUserValue()){
							exBean.setMessage("√");
							allRight++;	//正确个数加1
						}
						else
							exBean.setMessage("×");
						list.add(exBean);
						sum++;	//题目数加1
						if(sum == 10)	//限制每次答题数最多为10题
							next.setVisible(false);
						num.setText("第" + sum + "题:");
						src1.setText(ran.randomString(100));
						value1.setText("");
						}catch(Exception exp){};
					}
				}
			});
		}
		return next;
	}
	
	class ExpressionDialog extends JDialog{
		private static final long serialVersionUID = 1L;
		private JTextArea show = new JTextArea(10,20);
		public ExpressionDialog(JFrame parent){
			super(parent,"显示记录",true);
			init();
		}
		public void init(){
			Container c = getContentPane();
			c.setLayout(new FlowLayout());
			String showText = "您的测试情况如下:\n";
			for(int i=0;i<sum;i++){
				ExpressionBean showBean = list.get(i);
				showText = showText + showBean.getSrc()+" = " + showBean.getUserValue() + " " + showBean.getMessage() + " " +(showBean.getMessage().equals("√")?"":"正确答案:" + showBean.getValue()) + "\n";
			}
			showText = showText + "\n" + "您一共答题" + sum + "题  答题正确数:" +allRight + "  正确率:" + (float)allRight/sum*100 + "%"; 
			show.setText(showText);
			show.setEditable(false);	//不可编辑
			c.add(show);
			JButton ok = new JButton("确定");
			ok.addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					dispose();
				}
			});
			c.add(ok);
			setSize(330,300);
			setLocation((int)(screenSize.getWidth() - 300)/2,(int)(screenSize.getHeight() - 300)/2);
			setResizable(false);
			allRight = 0;
			
		}
	}
	
	//程序启动
	public static void main(String[] args){
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				ExpressionFrame thisClass = new ExpressionFrame();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -