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]這個研發小組的代碼,如果有人想看他們的代碼,可以自己去網上下載,由於下載鏈接我自己也找不到了,請大家原諒!!


發佈了105 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章