效果图:
----------------------------------------------------------------------》》
图形界面类:(主类)
package caculator;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class myWindow extends JFrame{
static String url = "D:/eclipseSpace/javaProject/src/caculator/image/icon.gif";//图标路径
static JTextField area;
static JButton [] button ;
static JButton [] functionButton ;
static JPanel leftLabel , numLabel ,rightLabel,bigLabel;
//leftLabel来添加左边的+-*/功能,numLabel添加数字键,rightLabel添加下面的三个按钮
static JButton time,AC,result,delete;
static JMenuBar jmb ;
static JMenu editMenu,help,m3;
static JMenuItem copy,paste,about;
public myWindow(){
//设置整体窗口
//设置菜单栏 。
jmb = new JMenuBar();
editMenu=new JMenu("编辑");
help=new JMenu("帮助");
copy = new JMenuItem("复制");
//设置快捷键Ctrl+C
copy.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_C,
InputEvent.CTRL_MASK));
paste = new JMenuItem("粘贴");
//设置快捷键Ctrl+V
paste.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_V,
InputEvent.CTRL_MASK));
about = new JMenuItem("关于");
//设置快捷键Ctrl+A
about.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_A,
InputEvent.CTRL_MASK));
//事件侦听
copy.addActionListener(new doAction());
paste.addActionListener(new doAction());
about.addActionListener(new doAction());
editMenu.add(copy);
editMenu.add(paste);
help.add(about);
jmb.add(editMenu);
jmb.add(help);
this.setJMenuBar(jmb);//设置菜单烂 end
this.setLayout(new BorderLayout());
this.setTitle("caculator");
Container con = getContentPane();
//实例化jlabel
bigLabel= new JPanel();
leftLabel = new JPanel();
numLabel = new JPanel();
rightLabel = new JPanel();
//设置显示区域
area=new JTextField(15);
area.setFocusable(false);
area.setBackground(Color.white);
area.setFont(new Font(Font.DIALOG,Font.BOLD,20));
//生成数字键
button = new JButton[12];
for(int i=0;i<12;i++){
button[i]=new JButton(i+1+"");
if(i==9)
button[i]=new JButton("00");
if(i==10)
button[i]=new JButton("0");
if(i==11)
button[i]=new JButton(".");
button[i].addActionListener(new doAction());
}
numLabel.setLayout(new GridLayout(4,3,2,2));
for(int i=0;i
}
//生成最右面三个按键
time=new JButton("时间");
time.addActionListener(new doAction());
AC=new JButton("清零");
AC.addActionListener(new doAction());
result=new JButton("=");
result.addActionListener(new doAction());
delete=new JButton("删除");
delete.addActionListener(new doAction());
rightLabel.setLayout(new GridLayout(4,1,2,2));
rightLabel.add(time);
rightLabel.add(AC);
rightLabel.add(delete);
rightLabel.add(result);
//最左边功能键+-*/
functionButton = new JButton[4];
String [] function = {"+","-","*","/"};
for(int i=0;i<4;i++){
functionButton[i]=new JButton (function[i]);
leftLabel.add(functionButton[i]);
functionButton[i].setForeground(Color.red);
//事件侦听注册
functionButton[i].addActionListener(new doAction());
}
leftLabel.setLayout(new GridLayout(4,1,2,2));
//添加到frame中
bigLabel.add(leftLabel);
bigLabel.add(numLabel);
bigLabel.add(rightLabel);
con.add(area,BorderLayout.NORTH);
con.add(bigLabel,BorderLayout.CENTER);
setSize(300,250);
setVisible(true);
this.setLocation(450,200);
setLayout(new FlowLayout());
//frame的关闭操作
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//调用设置图标的方法
this.setTitleIcon();
}
//设置标题栏图标的大小
public void setTitleIcon(){
Toolkit tk = Toolkit.getDefaultToolkit();
Image i = tk.getImage(url);
this.setIconImage(i);
}
public static void main(String[] args) {
new myWindow();
}
}
----------------------------------------------------------------------------------------------------------------------------------》》
处理类
package caculator;
import java.awt.Component;
import java.awt.Image;
import java.awt.Menu;
import java.awt.Toolkit;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.Popup;
public class doAction implements ActionListener {
final int MaxNumberLength=14;
public void actionPerformed(ActionEvent e) {
String event = e.getActionCommand();
// 处理显示时间的问题
if (event.equals("时间")) {
saveNum.num="";
saveNum.second="";
// 判断,线程已经启用,即saveNum.threadState为真时,不再从新启用
if (saveNum.threadState == false) {
saveNum.time = new Time();
saveNum.th = new Thread(saveNum.time);
saveNum.threadState = true;
saveNum.th.start();
}
}//结束时间处理问题
// 处理数字按钮
if (event.matches("[0-9]*") || event.equals(".")) {
// 判断,如果线程Time已经启动,那么结束线程
if (saveNum.threadState) {
saveNum.stopTimeRun();
}
//限制最大数字长度
if(saveNum.num.length()>MaxNumberLength-1){
saveNum.num=saveNum.num.substring(0, MaxNumberLength);
myWindow.area.setText(saveNum.num);
JOptionPane.showMessageDialog((Component) e.getSource(),
"可运行的数字长度不能超过 "+MaxNumberLength+" 位!!", "Wanning", JOptionPane.WARNING_MESSAGE);
return;
}
saveNum.num += event;
myWindow.area.setText(saveNum.num);
}
// 按等号时输出结果
if (event.equals("=")) {
// 判断,如果线程Time已经启动,那么结束线程
if (saveNum.threadState) {
saveNum.stopTimeRun();
}
//判断,如果没有输入第二个运算字就安等号,出现提示框
if (saveNum.second.equals("")|| !saveNum.second.matches("[0-9]*[.]?[0-9]*[eE]?[0-9]*")||saveNum.num.equals("")) {
JOptionPane.showMessageDialog((Component) e.getSource(),
"无效的操作", "Wanning", JOptionPane.WARNING_MESSAGE);
//saveNum.num="";
saveNum.second="";
return;
}
Double first = Double.parseDouble(saveNum.second.trim());
//判断,如果除数不能为小数点
if(saveNum.num.trim().matches("[.]*")){
JOptionPane.showMessageDialog((Component) e.getSource(),
"不能输入小数点", "Wanning", JOptionPane.WARNING_MESSAGE);
return;
}
Double second = Double.parseDouble(saveNum.num.trim());
// 四则运算
if (saveNum.type.equals("+")) {
saveNum.num = (first + second) + "";
}
if (saveNum.type.equals("-")) {
saveNum.num = (first - second) + "";
}
if (saveNum.type.equals("*")) {
saveNum.num = (first * second) + "";
}
if (saveNum.type.equals("/")) {
//判断,如果除数为0,提示除数不能为0
if(saveNum.num.trim().equals("0")||saveNum.num.trim().equals("00")){
JOptionPane.showMessageDialog((Component) e.getSource(),
"除数不能为0", "Wanning", JOptionPane.WARNING_MESSAGE);
return;
}
saveNum.num = (first / second) + "";
}
// 输出运算结果:
myWindow.area.setText(saveNum.num);
}
// 输入框清0
if (event.equals("清零")) {
// 判断,如果线程Time已经启动,那么结束线程
if (saveNum.threadState) {
saveNum.stopTimeRun();
}
myWindow.area.setText("");
saveNum.num = "";// 同时将记录的数据清0
}
// 四则运算
if (event.equals("+") || event.equals("-") || event.equals("*")
|| event.equals("/")) {
// 判断,如果线程Time已经启动,那么结束线程
if (saveNum.threadState) {
saveNum.stopTimeRun();
}
saveNum.second = saveNum.num;// 将第一次输入的数保存出来
saveNum.type = event;// 保存操作类型
saveNum.num = "";// 同时将记录的数据清0
myWindow.area.setText("");
}
//按下删除键时
if(event.equals("删除")){
//删除时如果时间正在运行,不做任何处理。删除只是对运算过程的数据有效
if (saveNum.threadState) {
return;
}
int length = saveNum.num.length();
//当至少有一个数字时才能删除
if(length>0)
saveNum.num = saveNum.num.substring(0, length-1);
myWindow.area.setText(saveNum.num);
}
//处理菜单栏中的事件
if(event.equals("复制")){
myWindow.area.selectAll();
myWindow.area.copy();
}
if(event.equals("粘贴")){
myWindow.area.paste();
if(!myWindow.area.getText().trim().matches("[0-9]*[.]?[0-9]*[eE]?[0-9]*")){
JOptionPane.showMessageDialog(null,"只能输入有效的运算数字","Warning",JOptionPane.WARNING_MESSAGE);
myWindow.area.setText("");
return;
}
else if(!saveNum.type.equals("")&& !saveNum.second.equals("")){
saveNum.num=myWindow.area.getText();
JOptionPane.showMessageDialog(null,"1","Warning",JOptionPane.WARNING_MESSAGE);
}else {
saveNum.num=myWindow.area.getText(); // 将第粘贴的数保存出来
JOptionPane.showMessageDialog(null,"2","Warning",JOptionPane.WARNING_MESSAGE);
}
}
if(event.equals("关于")){
String text="欢迎使用此计算器,本计算器的使用权归您所\n有,声明,本计算器版本为 1.0";
JOptionPane.showMessageDialog(null,
text, "关于计算器", JOptionPane.PLAIN_MESSAGE);
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------》》
中间类:
package caculator;
public class saveNum {
static String num="";
static String second=""; //用来存放中间数
static String type="";//保存运算类型
static Thread th=null;
static Time time=null;
static boolean threadState=false;
//结束time线程
@SuppressWarnings("deprecation")
public static void stopTimeRun(){
if(th.isAlive()){
th.stop();
threadState=false;
}
}
}
--------------------------------------------------------------------------------------》》
时间类:
package caculator;
import java.util.*;
public class Time implements Runnable{
@SuppressWarnings("deprecation")
@Override
public synchronized void run() {
while(saveNum.threadState==true){
Date date =new Date();
int hour , minute ,second ;
String time ;
hour = date.getHours();
minute=date.getMinutes();
second = date.getSeconds();
time=hour+":"+minute+":"+second;
if(hour>=0 && hour < 12){
myWindow.area.setText("AM "+time);
}
else{
myWindow.area.setText("PM "+time);
}
try {
Thread.sleep(1000);
}catch(Exception e){
}
}
}
}