java版的计算器程序

这是本人写的第二个计算器,说是写的还不如说是抄别人的,因为代码基本都是参考别人的代码写的,也没有进行优化改进,本人认为个人技术还没有达到可以单独完成一个工程即使是小工程的水平,于是就通过看别人的程序,然后敲一遍,自己然后挑bug,这个过程来学习java。

废话不多说,直接上代码

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop.Action;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.GregorianCalendar;

import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.xml.bind.Marshaller.Listener;
import javax.swing.*;


class calc extends JFrame implements ActionListener
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//private static final javax.swing.Action Listener = null;
	/*
	 * 计算器的菜单栏的定义部分
	 */
	private JMenuBar menubar = new JMenuBar();
	private JMenu menuEdit = new JMenu("edit");
		private JMenuItem menuItemCopy = new JMenuItem("copy",KeyEvent.VK_C);
		private JMenuItem menuItemcut = new JMenuItem("cut",KeyEvent.VK_V);
	private JMenu menuview = new JMenu("view");
		private JRadioButton boxstand = new JRadioButton("stand",true);
		private JRadioButton boxsience = new JRadioButton("science",false);
		private JMenuItem menuItemMath = new JMenuItem("math_group",KeyEvent.VK_I);
	private JMenu menuHelp = new JMenu("help");
		private JMenuItem menuItemhelp = new JMenuItem("help",KeyEvent.VK_H);
		private JMenuItem menuItemabout = new JMenuItem("About",KeyEvent.VK_A);
		
	private JPanel pansave = new JPanel();
	private JPanel panclear = new JPanel();
	private JPanel panBtn = new JPanel();
	
	private JTextField msg = new JTextField("0");
	private CalculateButton[] buttons = new CalculateButton[27];
	private JLabel lblbInfo = new JLabel();
	
	private double value = 0;
	private boolean hassaved = false;
	private double savenum = 0;
	private int operation = 0;
	private StringBuffer tmp = new StringBuffer();
	private int allowLength = 32;
	private boolean hasPreeesd = false;
	
	public calc()
	{
		setSize(280,260);
		setTitle("my first calculator!");
		Toolkit tk = Toolkit.getDefaultToolkit();
		setLocation((tk.getScreenSize().width-getWidth())/2,(tk.getScreenSize().height-getHeight())/2);
		initmenu();
		initbutton();
		initadd();
		
		pansave.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0),"up");
		pansave.getActionMap().put("up", new ButtonListener());
		
		setResizable(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	
	/*
	 * 添加菜单项
	 */
	private void initmenu()
	{
		setJMenuBar(menubar);
		menubar.add(menuEdit);
		/*
		 * public void setMnemonic(int mnemonic)设置当前模型上的键盘助记符。
		 * 助记符是某种键,它与外观的无鼠标修饰符
		 * (通常是 Alt)组合时(如果焦点被包含在此按钮祖先窗口中的某个地方)将激活此按钮
		 */
			menuEdit.setMnemonic(KeyEvent.VK_E);//设置键盘助记符
			menuEdit.add(menuItemCopy);
			menuItemCopy.setMnemonic(KeyEvent.VK_C);
			menuEdit.add(menuItemcut);
			menuItemcut.setMnemonic(KeyEvent.VK_V);
			
		menubar.add(menuview);
			menuview.setMnemonic(KeyEvent.VK_P);
			ButtonGroup group = new ButtonGroup();
			group.add(boxstand);
			group.add(boxsience);
			menuview.add(boxstand);
			menuview.add(boxsience);
			/*
			 * 这个是 菜单中横线分隔符号  就是在 两个菜单项的
			 */
			menuview.addSeparator();
			menuview.add(menuItemMath);
			
		menubar.add(menuHelp);
			menuHelp.setMnemonic(KeyEvent.VK_H);
			menuHelp.add(menuItemhelp);
			menuHelp.addSeparator();
			menuHelp.add(menuItemabout);
			
		menuHelp.addActionListener(this);
		menuItemCopy.addActionListener(this);
		menuItemcut.addActionListener(this);
			
			
	}
	
	/*
	 * 初始化按钮。部署以及事件的添加
	 */
	
		private void initbutton()
		{
			ButtonListener b = new ButtonListener();
			/*
			 * 按钮加减乘除,求倒数,正负号,开方,百分比,小数点
			 */
			buttons[0] = new CalculateButton(b,"=",KeyEvent.VK_EQUALS,false);
			buttons[1] = new CalculateButton(b,"+",KeyEvent.VK_ADD,false,Color.RED);
			buttons[2] = new CalculateButton(b,"-",KeyEvent.VK_SUBTRACT,false,Color.RED);
			buttons[3] = new CalculateButton(b,"*",KeyEvent.VK_MULTIPLY,false,Color.RED);
			buttons[4] = new CalculateButton(b,"/",KeyEvent.VK_DIVIDE,false,Color.RED);
			buttons[5] = new CalculateButton(b,"1/x",KeyEvent.VK_R,false);
			buttons[6] = new CalculateButton(b,"+/-",KeyEvent.VK_F9,false);
			buttons[7] = new CalculateButton(b,"sqrt",KeyEvent.VK_EQUALS,false);
			buttons[8] = new CalculateButton(b,"%",'%',false);
			buttons[9] = new CalculateButton(b,".",KeyEvent.VK_PERIOD,false);
			
			/*
			 * 按钮0-9
			 */
			buttons[10] = new CalculateButton(b,"0",KeyEvent.VK_0,false);
			buttons[11] = new CalculateButton(b,"1",KeyEvent.VK_1,false);
			buttons[12] = new CalculateButton(b,"2",KeyEvent.VK_2,false);
			buttons[13] = new CalculateButton(b,"3",KeyEvent.VK_3,false);
			buttons[14] = new CalculateButton(b,"4",KeyEvent.VK_4,false);
			buttons[15] = new CalculateButton(b,"5",KeyEvent.VK_5,false);
			buttons[16] = new CalculateButton(b,"6",KeyEvent.VK_6,false);
			buttons[17] = new CalculateButton(b,"7",KeyEvent.VK_7,false);
			buttons[18] = new CalculateButton(b,"8",KeyEvent.VK_8,false);
			buttons[19] = new CalculateButton(b,"9",KeyEvent.VK_9,false);
			
			/*
			 * MS:存当前显示的数值
			   MR:读取存储器中的数值,并显示出来
			   MC:清除已存的数据
			   M+:用已存的数值加上当前显示的数值后,再将结果保存
			   CE:将当前显示的数字清楚
			   Backspaces:退格键
			   C: 清除所有运算和输入
			 */
			buttons[20] = new CalculateButton(b,"MC",KeyEvent.VK_L,true,Color.RED);
			buttons[21] = new CalculateButton(b,"MR",KeyEvent.VK_R,true,Color.RED);
			buttons[22] = new CalculateButton(b,"MS",KeyEvent.VK_M,true,Color.RED);
			buttons[23] = new CalculateButton(b,"M+",KeyEvent.VK_P,true,Color.RED);
			buttons[24] = new CalculateButton(b,"Backspaces",KeyEvent.VK_BACK_SPACE,true,Color.RED);
			buttons[25] = new CalculateButton(b,"CE",KeyEvent.VK_DELETE,true,Color.RED);
			buttons[26] = new CalculateButton(b,"C",KeyEvent.VK_ESCAPE,true,Color.RED);
			
		}
		
		/*
		 * 初始化各个容易的添加
		 */
		private void initadd()
		{
			LineBorder b = new LineBorder(Color.RED);
			
			msg.setSize(240,20);
			msg.setLocation(6,4);
			msg.setEditable(false);
			msg.setBackground(Color.WHITE);
			msg.setMargin(new Insets(0, 6, 0, 8));
			msg.setHorizontalAlignment(JTextField.RIGHT);
			
			lblbInfo.setSize(30,26);
			lblbInfo.setLocation(8,30);
			lblbInfo.setBorder(new BevelBorder(BevelBorder.LOWERED));
			lblbInfo.setHorizontalAlignment(SwingConstants.CENTER);//通常用于在屏幕上定位或定向组件的常量的集合
			
			//增加MC,MR,MS,M+
			pansave.setSize(35,150);
			pansave.setLocation(6,60);
			pansave.setLayout(new FlowLayout(FlowLayout.CENTER,3,3));
			for(int i=20;i<24;i++)
			{
				pansave.add(buttons[i]);
			}
			
			//增加backspace,ce,c
			panclear.setSize(200,26);
			panclear.setLocation(45,30);
			panclear.setLayout(new FlowLayout(FlowLayout.CENTER,3,0));
			for(int i=24;i<27;i++)
			{
				panclear.add(buttons[i]);
			}
			
			panBtn.setSize(200,150);
			panBtn.setLocation(45,60);
			panBtn.setLayout(new FlowLayout(FlowLayout.CENTER,4,3));
			panBtn.add(buttons[17]);//7
			panBtn.add(buttons[18]);//8
			panBtn.add(buttons[19]);//9
			panBtn.add(buttons[4]);///
			panBtn.add(buttons[7]);//sqrt
			panBtn.add(buttons[14]);//4
			panBtn.add(buttons[15]);//5
			panBtn.add(buttons[16]);//6
			panBtn.add(buttons[3]);//*
			panBtn.add(buttons[8]);//%
			panBtn.add(buttons[11]);//1
			panBtn.add(buttons[12]);//2
			panBtn.add(buttons[13]);//3
			panBtn.add(buttons[2]);//-
			panBtn.add(buttons[5]);//1/x
			panBtn.add(buttons[10]);//0
			panBtn.add(buttons[6]);//+/-
			panBtn.add(buttons[9]);//.
			panBtn.add(buttons[1]);//+
			panBtn.add(buttons[0]);//=
			
			setLayout(null);
			add(msg);
			add(lblbInfo);
			add(panBtn);
			add(panclear);
			add(pansave);
			
		}
		public static void main(String[] argv)
		{
			new calc();
		}

		/*
		 * 处理按钮事件
		 * 复制和黏贴
		 * 
		 */
		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			if(e.getSource()==menuItemCopy)
			{
				msg.selectAll();
				msg.copy();
			}
			if(e.getSource()==menuItemcut)
			{
				try
				{
					/*
					 * 定义为传输操作提供数据所使用的类的接口。
					 * DataFlavor[] getTransferDataFlavors()返回 DataFlavor 对象的数组,
					 * 指示可用于提供数据的 flavor。该数组应该根据提供数据的偏好来排序(从描述最多的到描述最少的)。
					 * boolean isDataFlavorSupported(DataFlavor flavor)返回此对象是否支持指定的数据 flavor。
					 */
					Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);//???
					if(t!=null && t.isDataFlavorSupported(DataFlavor.stringFlavor))
					{
						//得到剪贴板中的字符串
						String text = (String) t.getTransferData(DataFlavor.stringFlavor);
						System.out.println("the test is :" +text);
						//得字符串中的数字 数组
						String[] sp = text.split("[\\D&&[^.]]");//需要复习一下正则表达式
						System.out.println("the text.split string  is :" +sp);
						if(sp.length>0)
						{
							String str = sp[sp.length-1];
							System.out.println(str);
							String[] sp2 = str.split("\\.");
							System.out.println(sp2.length);
							if(sp2.length>1)
							{
								String x = sp2[sp2.length-2];
								text = (x.equals("")?"0":x)+"."+sp2[sp2.length-1];
							}
							else
							{
								text = sp2[sp2.length-1];
								
							}
							msg.setText(text);//???????????????????????????????????????????????????????
						}
					}
				}catch(HeadlessException e1)
				{
					e1.printStackTrace();
				}catch(UnsupportedFlavorException e1)
				{
					e1.printStackTrace();
				}catch(IOException e1)
				{
					e1.printStackTrace();
				}    
			}
			if(e.getSource()==menuItemabout)
			{
				//new About(this,"关于本计算器",true);
			}
		}
		
		/*
		 * 按钮事件,加减乘除、取倒数、数字按钮等
		 */
		class ButtonListener extends AbstractAction
		{
			
			/**
			 *                                                                                                                           
			 */
			private static final long serialVersionUID = 1L;

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				int i = 0;
				for(i=0;i<buttons.length;i++)
				{
					if(e.getActionCommand().equals(buttons[i].getText()))
					{
						break;
					}
				}
				double value2;
				try
				{
					value2 = Double.parseDouble(msg.getText());
				}catch(NumberFormatException e1)
				{
					e1.printStackTrace();
					value2 = 0;
				}
				switch(i)
				{
				case 0:
					if(operation != 0)
					{
						double result = 0;
						switch(operation)
						{
						case 1:
							result = value + value2;
							break;
						case 2:
							result = value - value2;
							break;
						case 3:
							result = value * value2;
							break;
						case 4:
							result = value / value2;
							break;
						}
						showResult(result+"");
						hasPreeesd = false;
					}
					break;
				case 1:
				case 2:
				case 3:
				case 4:
					if(operation!=0 && hasPreeesd)
					{
						countResult(value2);
					}
					value = Double.parseDouble(msg.getText());
					if(tmp.length()>0)
					{
						tmp = new StringBuffer();
					}
					operation = i;
					break;
				case 5:
					if(value2!=0)
						showResult(1/value2+"");
					else
						showResult("cannot be zero!");
					break;
				case 6:
					if(value2!=0)
						showResult(value2*(-1)+"");
					else
						showResult("0");
					break;
				case 7:
					if(value2!=0)
						showResult(Math.sqrt(value2)+"");
					else
						showResult("0");
					break;
				case 8:
					showResult(value*value2/100+"");
					break;
				case 9:
					if(isContain(tmp.toString(),"."))
						break;
					if(value2 == 0)
						tmp.append(0);
					value2 = -1;
				case 10:
					if(value2==0)
						break;
				case 11:
				case 12:
				case 13:
				case 14:
				case 15:
				case 16:
				case 17:
				case 18:
				case 19:
					if(tmp.length()<=allowLength)
					{
						tmp.append(buttons[i].getText());
						msg.setText(tmp.toString());
						if(operation!=0 && hasPreeesd == false)
							hasPreeesd = true;
					}
					break;
				case 20:
					if(hassaved)
					{
						savenum = 0;
						hassaved = false;
						lblbInfo.setText("");
						
					}
					break;
				case 21:
					String result = savenum+"";
					msg.setText(result.endsWith(".0")?result.substring(0,result.length()-2):result);
					break;
				case 22:
					if(value2!=0)
					{
						savenum = value2;
						hassaved = true;
						lblbInfo.setText("M");
					}
					break;
				case 23:
					if(value2!=0)
					{
						savenum += value2;
						hassaved = true;
						lblbInfo.setText("M");
					}
					break;
				case 24:
					if(tmp.length()==1)
						showResult("0");
					if(tmp.length()>1)
						{
							tmp.deleteCharAt(tmp.length()-1);
							msg.setText(tmp.toString());
						}
					break;
				case 25:
					clearAll("0");
					break;
				case 26:
					clearAll("0");
					break;
				}
			}	
		}
		
		/*
		 * 检测某个字符串是否包含某个字符串
		 * @param str 待检测的字符串。
		 * @param ch 要包含的字符串。
		 * @return 包含返回true,否则false。
		 */
		private boolean isContain(String str,String ch)
		{
			return str.indexOf(ch)!=-1;
		}
		
		/*
		 * 设置得到的结果
		 * @param result 需要设置的结果
		 */
		
		private void showResult(String result)
		{
			msg.setText(result.endsWith(".0")?result.substring(0,result.length()-2):result);
			tmp = new StringBuffer();
		}
		
		
		/*
		 * 清空结果
		 */
		
		private void clearAll(String result)
		{
			showResult(result);
			value =0;
			operation = 0;
			hasPreeesd = false;
		}
		
		/*
		 * 计算结果,并显示结果
		 */
		
		private void countResult(double value2)
		{
			double result = 0;
			switch (operation) {
			case 1:
				result = value2 + value;
				break;
			case 2:
				result = value - value2;
				break;
			case 3:
				result = value * value2;
				break;
			case 4:
				result = value/value2;
				break;
			default:
				break;
			}
			showResult(result+"");
			hasPreeesd = false;
			value = result;
		}	
}



class CalculateButton extends JButton
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public CalculateButton(javax.swing.Action Listener,String text,int key,boolean isctrl)
	{
		addActionListener(Listener);
		if(isctrl)
			getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key,InputEvent.CTRL_DOWN_MASK), text);
		else
			getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key,0), text);
		
		getActionMap().put(text, Listener);
		
		setPreferredSize(new Dimension(35,26));
		setForeground(Color.BLUE);
		setText(text);
		setFont(new Font("Tahoma",Font.PLAIN,12));
		setMargin(new Insets(0, 0, 0, 0));
	}
	
	
	/*
	 * 构造一个具有缺省事件、指定文本、制定快捷键、指定文本颜色的JButton
	 * @param listener Action事件。
	 * @param text 按钮上的文本。
	 * @param key 快捷键,键值。
	 * @param isctrl 是否键入Ctrl
	 * @param color 文本的颜色。
	 */
	
	public CalculateButton(javax.swing.Action Listener,String text,int key,boolean isctrl,Color color)
	{
		this(Listener,text,key,isctrl);
		setForeground(color);
	}
	/**
	 * 构造一个具有缺省事件、指定文本、指定快捷键、指定文本颜色的JButton。
	 * @param listener Action事件。
	 * @param text 按钮上的文本。
	 * @param key 快捷键,键值。
	 * @param isctrl 是否键入Ctrl
	 * @param color 文本的颜色。
	 * @param width 按钮的宽度。
	 * @param height 按钮的高度。
	 */
	public CalculateButton(javax.swing.Action Listener,String text,int key,boolean isctrl,Color color,int width,int height)
	{
		this(Listener,text,key,isctrl);
		setSize(width,height);
		setPreferredSize(new Dimension(width,height));//首先选定的button的大小
		
	}
	
	/**
	 * 绘制边界。
	 * @param g Grahpics画笔。
	 */
	
	protected void paintBorder(Graphics g)
	{
		super.paintBorder(g);
		Color c = g.getColor();
		g.setColor(getBackground());
		g.translate(0, 0);
		g.drawRoundRect(0, 0, getWidth(), getHeight(), 10, 10);//绘制圆角矩形
		g.setColor(c);
	}
}


class myBorder implements Border
{
	GradientPaint gp = null;//从颜色C1到颜色C2按比例渐变(线性渐变)
	Timer t = new Timer(100,new Dong());
	int pos = 0;
	boolean b = true;
	Component cc = null;
	public myBorder(Component cc)
	{
		this.cc = cc;
		cc.addMouseListener(new MouseE());//获得来自cc这个部件的鼠标事件,有就反应,没有就什么也不做
	}
	
	class MouseE implements MouseListener
	{

		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			//鼠标点击函数
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			if(t.isRunning())
			{
				t.stop();
				t.restart();
			}
			else
			{
				t.restart();
			}
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			if(t.isRunning())
			{
				t.stop();
			}
		}
		
	}
	@Override
	public void paintBorder(Component c, Graphics g, int x, int y, int width,
			int height) 
	{
		// TODO Auto-generated method stub
		if(b)
		{
			pos += 5;
			if(pos>=255)
			{
				b = false;
			}
		}
		else
		{
			pos -= 5;
			if(pos<=0)
			{
				b = false;
			}
		}
		Graphics2D g2 = (Graphics2D)g;
		gp = new GradientPaint(pos, 0, new Color(222, 222, 222), 10+pos, 30, new Color(111, 1, 111, 80),true);
		g2.setPaint(gp);
		g2.setStroke(new BasicStroke(5));//利用特定的线宽值创建一个BasicStroke
		
		Rectangle2D br = new Rectangle2D.Double(x, y, width, height);
		g2.draw(br);
	}

	@Override
	public Insets getBorderInsets(Component c) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean isBorderOpaque() {
		// TODO Auto-generated method stub
		return true;
	}
	
	class Dong implements ActionListener
	{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			cc.repaint();
		}
		
	}
	
}


class myDongclabel extends JLabel implements Runnable
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int a = 0;
	Thread th = null;
	public myDongclabel()
	{
		setSize(500,10);
		setOpaque(true);
		th = new Thread(this);
		th.start();
	}
	
	public void paint(Graphics oldg)
	{
		Graphics2D g = (Graphics2D)oldg;
		g.setStroke(new BasicStroke(200));
		g.setPaint(new GradientPaint(a, 20, Color.BLUE, a+250, 20, new Color(98, 100, 200), true));
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true)
		{
			a += 3;
			repaint();
			try
			{
				Thread.currentThread();
				Thread.sleep(11);
			}catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
}

class MyPicLabel extends JLabel implements Runnable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int id = 0;
	int a = 200;
	boolean flag = false;
	Thread th = null;
	Image img[] = new Image[2];
	BufferedImage bi = null;
	Graphics gg = null;
	URL url[] = new URL[]
			{
			MyPicLabel.class.getResource("C:\\Users\\TONY\\Desktop\\Java项目\\计算器\\计算器\\源代码\\src\\about\\21.jpg"),
			MyPicLabel.class.getResource("C:\\Users\\TONY\\Desktop\\Java项目\\计算器\\计算器\\源代码\\src\\about\\A3.jpg")
			};
	public MyPicLabel()
	{
		//GradientPaint jj = new G
		GregorianCalendar jj = new GregorianCalendar();
		
		Toolkit tk = Toolkit.getDefaultToolkit();
		img[0] = tk.createImage(url[0]);
		img[1] = tk.createImage(url[1]);
		try
		{
			MediaTracker mt = new MediaTracker(this);
			mt.addImage(img[0], 0);
			mt.addImage(img[1], 0);
			mt.waitForAll();
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		bi = new BufferedImage(128, 128, BufferedImage.TYPE_INT_BGR);
		gg = bi.createGraphics();
		th = new Thread(this);
		th.start();
	}
	
	public void paint(Graphics g)
	{
		Graphics2D g1 = (Graphics2D)g;
		
		gg.drawImage(img[id], 0, 0, 130, 130, 0, 0, 130, 130, this);
		for(int j=0;j<128;j++)
		{
			for(int i=0;i<128;i++)
			{
				int pix = bi.getRGB(i, j);
				Color c = new Color(pix);
				int r = c.getRed();
				int gr = c.getGreen();
				int b = c.getBlue();
				int newpix = new Color(r,gr,b,a).getRGB();
				bi.setRGB(i, j, newpix);
			}
		}
		g.setColor(Color.WHITE);
		g.drawImage(bi, 0, 0, this);
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(th!=null)
		{
			if(flag)
			{
				a += 4;
				if(a==200)
				{
					flag = !flag;
				}
			}
			else
			{
				a -= 4;
				if(a==0)
				{
					flag = !flag;
					id++;
					if(id==2)
						id = 0;
					
				}
			}
			repaint();
			try
			{
				Thread.currentThread();
				Thread.sleep(100);
			}catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
}

代码运行的结果如下图所示,文中所有的打印输出部分都可以删除,全部都是我为了看中间的输出结果而加上的

这个程序大家看见了,运行结果虽然可以使用,但是上面一排中间的退格键等三个键的大小很是不美观,我为了调这个错误,花了很长的时间(本人是大菜鸟),最后发现是构造函数使用错了

setPreferredSize(new Dimension(35,26));

这一句话是设定大小的,无论是按钮还是其他的,也就是大小的偏好设置

在CalculateButton类中重构了两个函数,

public CalculateButton(javax.swing.Action Listener,String text,int key,boolean isctrl,Color color)

public CalculateButton(javax.swing.Action Listener,String text,int key,boolean isctrl,Color color,int width,int height)

我在定义buttons的时候,全部使用的都是第一个构造函数,导致buttons的大小都是默认的,如若想要自定义按钮的大小,就应该通过第二个重构的函数中的width和height来改变按钮的大小。

于是把

buttons[24] = new CalculateButton(b,"Backspaces",KeyEvent.VK_BACK_SPACE,true,Color.RED);
buttons[25] = new CalculateButton(b,"CE",KeyEvent.VK_DELETE,true,Color.RED);
buttons[26] = new CalculateButton(b,"C",KeyEvent.VK_ESCAPE,true,Color.RED);
这三行代码稍微改写一下

就可以得到正确的结果了


buttons[24] = new CalculateButton(b,"Backspace",KeyEvent.VK_BACK_SPACE,false,Color.RED,62,25);
buttons[25] = new CalculateButton(b,"CE",KeyEvent.VK_DELETE,false,Color.RED,62,25);
buttons[26] = new CalculateButton(b,"C",KeyEvent.VK_ESCAPE,false,Color.RED,62,25);

得到的结果如下图所示:


还有一个问题,我没有改动,本来我是想着可以让计算器的界面大小可以自由调整,于是我把

setResizable(true);

改成了true,但是发现这个界面大小的调整不能改变JPanel中组件的大小,所以,如果有人使用这个程序的时候,不想要界面大小的改变,那么把上面那句话改成false就可以了!!

到此我的第二个程序写完了!

对了在此声明一下,我的所有代码都是参考达内科技[Tarena Training Group]这个研发小组的代码,如果有人想看他们的代码,可以自己去网上下载,由于下载链接我自己也找不到了,请大家原谅!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值