📄 expressionframe.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 + -