您的位置:首页 > 编程语言 > Java开发

Java 简单计算器

2010-10-07 18:56 183 查看
计算器大家都用过,不过自己写的还是很有情感的,今天下午完成了一个初级的计算器开发,主要锻炼下自己对于图形界面的设计,以及事件侦听的写法加以巩固。



主要代码如下:



package homework;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.*;
import java.io.Serializable;

import javax.swing.*;

public class Calc extends JFrame{
	JMenu edit,find,help;
	JMenuItem cut,copy,paste;//edit child
	JMenuItem standard,science;//find child
	JMenuItem helpItem;//help child
	JMenuBar menubar;//menu's father
	JTextField field;
	JButton btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btnc,btnadd,btndel,btnmul,btndiv,btnas,btndot;
	JPanel panel1,panel2,panel3;
	Clipboard clipboard=null;
	public Calc()
	{
		super("計算器");
		
		clipboard=getToolkit().getSystemClipboard();//获取系统剪贴板。
		JFrame.setDefaultLookAndFeelDecorated(true);
		/*******************************菜单栏*******************************************/
		edit=new JMenu("编辑");
		cut=new JMenuItem("剪切");
		copy=new JMenuItem("复制");
		paste=new JMenuItem("粘贴");
		edit.add(cut);
		edit.add(copy);
		edit.add(paste);
		
		find=new JMenu("查看");
		standard=new JMenuItem("标准");	
		science=new JMenuItem("科学");
		find.add(standard);
		find.add(science);
		
		help=new JMenu("帮助");
		helpItem=new JMenuItem("帮助主题");
		help.add(helpItem);
		
		menubar=new JMenuBar();
		menubar.add(edit);
		menubar.add(find);
		menubar.add(help);
		/*************************设置菜单的快捷方式*********************************************/
		edit.setMnemonic('E');
		find.setMnemonic('F');
		help.setMnemonic('H');
		copy.setMnemonic('C');
		paste.setMnemonic('V');
		standard.setMnemonic('S');
		science.setMnemonic('T');
			
		panel1=new JPanel();
		BorderLayout b1=new BorderLayout();
		//创建边界布局管理器
		panel1.setLayout(b1);               
		//将panel布局设置为边界模式
		panel1.add(menubar);
		//创建编辑框 
		field=new JTextField(25);
		field.setEditable(false);            //设置编辑框为只读的
		panel2=new JPanel();
		panel2.add(field);
		//field.setSize(40);
		//设置计算面板  包含按钮!
		//这部分有问题的,由于还没有完成好看的布局,暂且放下!!!!!!!!!!!!
		/*******************************按钮设置*****************************************************/
		btn0=new JButton("0");
		btn1=new JButton("1");
		btn2=new JButton("2");
		btn3=new JButton("3");
		btn4=new JButton("4");
		btn5=new JButton("5");
		btn6=new JButton("6");
		btn7=new JButton("7");
		btn8=new JButton("8");
		btn9=new JButton("9");
		btnadd=new JButton("+");
		btndel=new JButton("-");
		btnmul=new JButton("*");
		btndiv=new JButton("/");
		btnas=new JButton("=");
		btnc=new JButton("c");
		btndot=new JButton(".");
		
		panel3=new JPanel();
		panel3.add(btn0);panel3.add(btn1);panel3.add(btn2);panel3.add(btn3);
		panel3.add(btn4);panel3.add(btn5);panel3.add(btn6);panel3.add(btn7);
		panel3.add(btn8);panel3.add(btn9);panel3.add(btnadd);panel3.add(btndel);
		panel3.add(btnmul);panel3.add(btndiv);panel3.add(btnas);panel3.add(btnc);
		panel3.add(btndot);
		
	
		
		panel3.setLayout(new GridLayout(5,4));
		
		//将三部分加入面板中
		Container content=getContentPane();
		content.add(panel1,BorderLayout.NORTH);
		content.add(panel2,BorderLayout.CENTER);
		content.add(panel3,BorderLayout.SOUTH);
		
		//getContentPane().add(panel1);
		//getContentPane().add(panel2);
		
		setVisible(true);
		setSize(300,230);
		
		/*****************************添加侦听事件**********************************************/
		CalcListener listen=new CalcListener();
		copy.addActionListener(listen);
		paste.addActionListener(listen);
		standard.addActionListener(listen);
		science.addActionListener(listen);
		helpItem.addActionListener(listen);
		
		btn0.addActionListener(listen);btn1.addActionListener(listen);btn2.addActionListener(listen);
		btn3.addActionListener(listen);btn4.addActionListener(listen);btn5.addActionListener(listen);
		btn6.addActionListener(listen);btn7.addActionListener(listen);btn8.addActionListener(listen);
		btn9.addActionListener(listen);btnadd.addActionListener(listen);btnas.addActionListener(listen);
		btndiv.addActionListener(listen);btnmul.addActionListener(listen);btndel.addActionListener(listen);
		btnc.addActionListener(listen);btndot.addActionListener(listen);
		
		addWindowListener( new WindowAdapter(){
			public void windowClosing(WindowEvent e)
			{
				
			}
		});
	}
	
	static int count=0;
	double sum=0.0,sum1=0.0;
	static int flag=0;
	class CalcListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			/**************************************以下为按钮的事件响应*******************************/
			String name=field.getText();
			if(e.getSource().equals(btn0))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"0");
			}
			if(e.getSource().equals(btn1))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"1");
			}
			if(e.getSource().equals(btn2))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"2");	
			}
			if(e.getSource().equals(btn3))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"3");	
			}
			if(e.getSource().equals(btn4))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"4");	
			}
			if(e.getSource().equals(btn4))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"4");
			}
			if(e.getSource().equals(btn5))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"5");
			}
			if(e.getSource().equals(btn6))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"6");
			}
			if(e.getSource().equals(btn7))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"7");
			}
			if(e.getSource().equals(btn8))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"8");
			}
			if(e.getSource().equals(btn9))
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+"9");
			}
			if(e.getSource().equals(btndot))//小数点
			{
				if(flag==1)
				{
					field.setText("");
				}
				field.setText(name+".");
			}
			if(e.getSource().equals(btnadd))//加法运算
			{
				sum=Double.valueOf(field.getText());
				field.setText("");	
				count=0;
			}
			if(e.getSource().equals(btndel))//减法运算
			{
				
				sum=Double.valueOf(field.getText());
				field.setText("");	
				count=1;
			}
			if(e.getSource().equals(btndiv))//除法运算
			{
				sum=Double.valueOf(field.getText());
				field.setText("");	
				count=2;
			}
			if(e.getSource().equals(btnmul))//乘法运算
			{
				sum=Double.valueOf(field.getText());
				field.setText("");	
				count=3;
			}
			if(e.getSource().equals(btnas))//等于号运算*********************这个有毛病的
			{
				sum1=Double.valueOf(field.getText());
				
				switch(count)
				{
				case 0:
					sum+=sum1;
					break;
				case 1:
					sum-=sum1;
					break;
				case 2:
					sum/=sum1;
					break;
				case 3:
					sum*=sum1;
					break;
				}
				
				field.setText(String.valueOf(sum));
				sum=0.0;
				sum1=0.0;
				name="";
				flag=1;//这里的好像不管用哎。。。郁闷啊,不知道怎么在计算结果后把文本框清空,上面写的都不管用
				          //真的很恼人啊,还好毛病不大,慢慢加油
			}
			if(e.getSource().equals(btnc))//清空运算
			{
				field.setText("");
			}
			/*******************************菜单的侦听事件**************************************/
			if(e.getActionCommand().equals("剪切"))
			{
				//  String   temp=field.getSelectedText();       //拖动鼠标选取文本。   
                //  StringSelection   text=new   StringSelection(temp);   
                //  clipboard.setContents(text,null);   
                  
                //  int   start=field.getSelectionStart();   
				//   int   end     =field.getSelectionEnd();     
				//   field.setText(temp.substring(start, end))   ;   //从field中删除被选取的文本。     

			}
			if(e.getActionCommand().equals("复制"))
			{			
				String temp=field.getText();
				Transferable tText = new StringSelection(temp);   //把String类型转换为 Transferable
				clipboard.setContents(tText, null);               // 设置剪切板中的内容
			}
			if(e.getActionCommand().equals("粘贴"))
			{
				Transferable   contents=clipboard.getContents(this);   
                DataFlavor     flavor=   DataFlavor.stringFlavor;   
                if(   contents.isDataFlavorSupported(flavor))   
                {   try{    
                    	String   str;   
                        str=(String)contents.getTransferData(flavor);   
                        field.setText(str);
                    	}catch(Exception   ee)
                    	{}
                }
            }   
		}
		/*测试用的
		 * private void showMsg(String sMsg)
		{
			JOptionPane.showMessageDialog(null, sMsg);
		}*/
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Calc();
	}

}
针对以上代码我加以阐述,主要就是粘贴板的书写:

import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;

Clipboard clipboard=null;
clipboard=getToolkit().getSystemClipboard();//获取系统剪贴板。

对于String 转换为 Transferable 可以主要参考下面的程序,网上找的加上我改的,很管用了
	if(e.getActionCommand().equals("复制"))
			{			
				String temp=field.getText();
				Transferable tText = new StringSelection(temp);   //把String类型转换为 Transferable
				clipboard.setContents(tText, null);               // 设置剪切板中的内容
			}
			if(e.getActionCommand().equals("粘贴"))
			{
				Transferable   contents=clipboard.getContents(this);   
                DataFlavor     flavor=   DataFlavor.stringFlavor;   
                if(   contents.isDataFlavorSupported(flavor))   
                {   try{    
                    	String   str;   
                        str=(String)contents.getTransferData(flavor);   
                        field.setText(str);
                    	}catch(Exception   ee)
                    	{}
                }
            }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: