题目要求
自己编写所有代码,设计一个程序的界面。该程序的功能要求是:运行之后,界面要求基本如左 图所示。其中界面设计时的顶层容器要求使用 JFrame(或 Frame), 界面上的“简易计算器”、“运算数一”、“运算数二”、“运算结果” 这些提示标签使用组件 JLabel(或 Label) ,输入运算数和输出运 算结果使用 JTextField(或 TextField),“相加”、“相减”和“全 部清零”使用按钮 JButton(或 Button)。 请注意查阅 JDK 的 API 文档中这些相关的类,看看它们具有哪些构造函数可以用来生成 所需的对象,它们具有哪些方法可以用来进行调用。注意保存好 本次实验代码,下一次实验将会要求实现其事件处理以继续完善。
在上一个实验(实验三)的第 1 题中,我们设计了一个简易计算器的界面。但仅仅要求设计出其 界面,而没有要求进行事件处理。在本次实验中,请实现其事件处理。使得程序运行之后,当输入两个 小数作为运算数后,点击“相加”或者“相减”按钮,两数相加或相减的结果就会显示在“运算结果” 框中。 如果点击“全部清零”按钮,那么两个运算数输入框和运算结果框中就会完全被清空。 2、对于第 1 题,除了正常数据之外,用户还可能因为好奇或误操作导致这样几种情况: (1)1 个 或 2 个运算数均未输入;(2)输入的数据串中含有除小数点和数字之外的非法字符;(3)输入的数据串 中不含有除小数点和数字之外的非法字符,但小数点的个数超过 1 个或小数点的位置在数据的开头或结 尾处。 请改进你的程序,对这几种情况进行判断,不允许使用正则表达式或异常处理机制,完全使用字 符串类的各种方法,对这几种输入情况得到的用户所输入的字符串进行分析判断,并在你的程序图形界 面上向用户进行相应的提示。
上代码
说明:这是我第一次做页面,感觉很棒,但是花的时间太长,而且找bug找的很鸡肋,最后发现这个bug不是我逻辑上的问题,而是由于复制粘贴的时候没有好好修改要修改的内容,所以我告诉大家:复制粘贴一时爽,一直复制粘贴一直爽爆。
发现这个代码块用不了了,算了直接复制过来吧
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class FrameApp extends JFrame{
JFrame jfr = new JFrame("计算器");//搞个容器先
JButton b1 = new JButton("相加");
JButton b2 = new JButton("相减");
JButton b3 = new JButton("全部清零");
JTextField text1;
JTextField text2;
JTextField text3;
JLabel lable1;
JLabel lable2;
JLabel lable3;
public FrameApp (){
jfr.setSize(410,550);//容器页面大小
jfr.setLayout(null);//设置为null布局
b1.setSize(100,35);
b1.setLocation(70,305);
b2.setSize(100,35);
b2.setLocation(210,305);
b3.setSize(100,35);
b3.setLocation(135,390);
lable1 = new JLabel("第一个数字:");
lable1.setSize(100,100);
lable1.setLocation(58,62);
lable2 = new JLabel("第二个数字:");
lable2.setSize(100,100);
lable2.setLocation(58,127);
lable3 = new JLabel("运算的结果:");
lable3.setSize(100,100);
lable3.setLocation(58,191);
text1 = new JTextField();
text2 = new JTextField();
text3 = new JTextField();text3.setEditable(false);
text1.setSize(145,30);
text1.setLocation(129,95);
text2.setSize(145,30);
text2.setLocation(129,160);
text3.setSize(145,30);
text3.setLocation(129,224);
jfr.add(lable1);jfr.add(text1);
jfr.add(lable2);jfr.add(text2);
jfr.add(lable3);jfr.add(text3);
jfr.add(b1);
jfr.add(b2);
jfr.add(b3);
//添加监听器
b3.addActionListener(new MyEvent());
b1.addActionListener(new MyEvent());
b2.addActionListener(new MyEvent());
jfr.setResizable(true);
jfr.setVisible(true);//得放最后
//pack();
jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//可以关闭
}
public static void main(String args[]) {
FrameApp a = new FrameApp();
}
/*监听器实现类*/
class MyEvent implements ActionListener{
int i;
public void actionPerformed(ActionEvent evt) {
if((evt.getSource() == b3))//清零效果
{
text1.setText("");
text2.setText("");
text3.setText("");
}
else if((evt.getSource() == b1))//相加效果
{
if(judge() == 0)
{
text1.setText("");
text2.setText("");
return;
}
double a = Double.parseDouble(text1.getText());
double b = Double.parseDouble(text2.getText());
String reslut = Double.toString(a+b);
text3.setText(reslut);
}
else //相减效果
{
if(judge() == 0)
{
text1.setText("");
text2.setText("");
text3.setText("");
return;
}
double a = Double.parseDouble(text1.getText());
double b = Double.parseDouble(text2.getText());
String reslut = Double.toString(a-b);
text3.setText(reslut);
}
}
private int judge() {//用于判断输入是否合法
int i =0;
String a = null;
String b = null;
int sumOfPoint = 0;
// for( i =0;i<a.length();i++)
// System.out.print(a.charAt(i));
// System.out.println("");
// for( i =0;i<a.length();i++)
// System.out.print(b.charAt(i));
if(text1.getText().length() == 0 || text2.getText().length() == 0)//判断运算符输入完整没有
{
JOptionPane.showMessageDialog(null, "你没有填完整运算数字,请重新输入");
return 0;
}
a = text1.getText();
b = text2.getText();
if( a.charAt((a.length()-1)) == '.' || a.charAt(0) == '.' || b.charAt((b.length()-1)) == '.' || b.charAt(0) == '.')
{
JOptionPane.showMessageDialog(null, "你输入的小数点处于最前面或者最后面,请重新输入");
return 0;
}
for( i = 0;i<a.length();i++)//判断运算符一有没有包含非法运算符,即输入了除了小数点和数字的字符
{
if(a.charAt(i) == '.')//计数运算数一的小数点数,如果大于一个就是错误的
sumOfPoint++;
if(sumOfPoint>1 )
{
JOptionPane.showMessageDialog(null, "你输入的小数太多了,请重新输入");
return 0;
}
if(a.charAt(i) !='.' && a.charAt(i) !='0' && a.charAt(i) !='1' && a.charAt(i) !='2' && a.charAt(i) !='3' && a.charAt(i) !='4' && a.charAt(i) !='5' && a.charAt(i) !='6' && a.charAt(i) !='7' && a.charAt(i) !='8' && a.charAt(i) !='9' )
{
JOptionPane.showMessageDialog(null, "你输入含有非法字符,请重新输入");
return 0;
}
}
sumOfPoint = 0;//计数运算符二里边的小数点
for( i = 0;i<b.length();i++) //判断运算符二有没有包含非法运算符,即输入了除了小数点和数字的字符
{
if(b.charAt(i) == '.')//计数运算符二的小数点数,如果大于一个就是错误的
sumOfPoint++;
if(sumOfPoint>1)
{
JOptionPane.showMessageDialog(null, "你输入的小数点太多了,请重新输入");
return 0;
}
if(b.charAt(i) !='.' && b.charAt(i) !='0' && b.charAt(i) !='1' && b.charAt(i) !='2' && b.charAt(i) !='3' && b.charAt(i) !='4' && b.charAt(i) !='5' && b.charAt(i) !='6' && b.charAt(i) !='7' && b.charAt(i) !='8' && b.charAt(i) !='9' )
{
JOptionPane.showMessageDialog(null, "你输入含有非法字符,请重新输入");
return 0;
}
}
return 1;
}
}}