实验要求和目的:
1.理解掌握图形界面的设计
2.理解整体算法的思路,即actionPerformed()的算法
3.输入日期,完成星期几的计算,并输出星期值(注意日期输入的合法性)
4.输入日期加天数,完成日期加天数的计算,并输出新日期(注意日期的合法
输入,以及注意日期不能加日期,即第二次输入的只能是天数)
5.输入日期以及天数或日期,如果为天数,计算日期减天数,否则计算如
期减日期,将得到新日期或者相应天数差值,并输出。
6.进一步学习java的编程思想。
思路分析:
1.为使程序美观,使用了多个JPanel和不同的LayoutManager(比如FlowLayout、
BorderLayout、GridLayout)进行布局设计,同时限定了窗口字体的大小;
2.封装了一个创建数字按钮的方法getNumberButton(int n),可以快速地进行增加数字按钮的操作;
3.为将文本框中的字符串转换为日期编写了toDate()方法,其中包括日期输入错误的异常处理,此方法在保存当前日期、获取
减法操作的日期时被复用;
4.因为要实现键盘和鼠标的双重操作,将操作时使用的几个方法(pressButton\pressEqualButton\pressOPButton等)封装起来,
使其可供多个监听器调用;
5.为能通过键盘操作,对所有按钮注册了监听器;
6.为判断当前是否处于输入状态(否则处于程序提示状态),使用布尔型属性inputing标记当前状态,当其为false时,向文本
框中输入字符会清空文本框;
7.为实现+-操作、使用了plus和minus两个布尔型属性来标记当前状态,同时使用了一个Calendar属性
保存当前日期,在每步操作时都对其进行改变,最后=时是输出。
8.考虑到可能存在多次连续+-操作,设计了更完善的算法。
存在问题
如:1.由于不知道如何进行全局的键盘监听,目前只是对所有按钮注册了监听器;
2.如果经过减操作的日期是公元前的日期,结果依然会显示为公元年份。
package cn.lanan.com;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.sound.midi.Synthesizer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator_8 extends JFrame {
JTextField textFile;
Date date;
String fullString;// 全局
String beforeSymbol,afterSymbol;
Calendar calendar,calendar1;// 全局变量用来保存时间
long timeInMillis,timeInMillis1;
//bolean:确保第一次都是将日期转换成yyyy年MM月dd日是 E形式
//isNumber:判断输入的字符是否是数字还是非数字
//isSymbol:判断符号是+还是-,true表示+
//键盘监听事件keyLitener
boolean bolean=true, isSymbol=true;
int mmmm;
public Calculator_8() {
JFrame jf = new JFrame("日期计算机");
jf.setLayout(new FlowLayout());
jf.setBounds(500, 150, 756, 350);
textFile = new JTextField(50);
Dimension preferredSize = new Dimension(30, 40);
textFile.setPreferredSize(preferredSize);
JButton anm = new JButton("测试");
textFile.requestFocus();
Jtl jtl = new Jtl();
anm.addActionListener(jtl);
textFile.addKeyListener(jtl);
JPanel jpanel = new JPanel();
jpanel.setLayout(new BorderLayout());
JPanel jpanel_center = new JPanel();
jpanel_center.setLayout(new GridLayout(4, 3, 10, 10));
JPanel jpanel_north = new JPanel();
JPanel jpanel_east = new JPanel();
jpanel_east.setLayout(new GridLayout(4, 1, 10, 10));
jpanel_north.add(textFile);
jpanel_north.add(anm);
jpanel.add(jpanel_north, BorderLayout.NORTH);
for (int i = 1; i < 10; i++) {
jpanel_center.add(getNumberButton(i));
}
jpanel_center.add(getNumberButton("CE"));
jpanel_center.add(getNumberButton(0));
jpanel_east.add(getNumberButton("+"));
jpanel_east.add(getNumberButton("-"));
jpanel_east.add(getNumberButton("/"));
jpanel_east.add(getNumberButton("="));
jpanel.add(jpanel_east, BorderLayout.EAST);
jpanel.add(jpanel_center, BorderLayout.CENTER);
jf.add(jpanel);
// ===========设置容器的可见性及可关闭性
jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
// jf.pack();
jf.setResizable(false);
jf.setVisible(true);
}
// ====================方法区===================================
private JButton getNumberButton(int n) {
// 设置按钮的大小
// Dimension preferredSize = new Dimension(10,10);
JButton an = new JButton("" + n);
// an.setPreferredSize(preferredSize);
Jtl jtz = new Jtl();