java學習筆記--計算器和日曆

    好久沒寫博客了,看最近的一篇博客還是爲她做光立方的時候的文章,這期間,其實我學習了好多,很雜,都不知道說什麼好,其實還是有很多不錯的東西可以寫的,但是一直都比較懶,不想寫,今天突然想寫,也不是因爲今天清明節,只是,最近看到傻博一直不斷更新他的博客,讓我有一種使命感,我不該這麼墮落。

    其實,這期間,我做過紅外遙控器,但是,怎麼說呢,不算很成功,代碼一直調得不好,也就不是很想寫,其實,做那個心得還是很多的,尤其是調代碼的時候,很多人給了我很多寶貴的意見,其中就有皮皮同學告訴我的最簡單的按鍵檢測程序,我當時看了下,真的有很多,很出色的程序,一直想寫的,但是,太懶了。

    後來吧,其實有看過Linux的知識,其實這纔是我最最想學的,但是,我也只學了點皮毛,不過,我保證,肯定不會只是學這點的,我只是現在沒時間,有空了,我一定好好學Linux。

    嗯,因爲老師這邊說有一個Android開發的項目要做,所以,我最近纔開始看java,真的是最近,算上今天的話,才第三天看java,不過,我可以說,我有我自己的理解。雖然,突然有點轉行的味道,但是,其實也沒有什麼,畢竟也就是一門語言的學習而已,以前有C的基礎,只是可惜沒學好C++,所以現在有時候和傻博一起討論程序的時候,表示很無力,所以我在補習語言基礎,爲此看了C,彙編,現在在看java,等這個項目做完,我學Linux的時候會用shell編程,之後學Python,其實這些是自己的規劃,不過不知道自己這麼懶,能不能做好,哎。

    說重點吧,其實,這只是一篇自我總結,因爲老師讓我這周之內看完一本java的基礎語法的書,(週四晚上問我的、、、)其實,我看了他給我的資料,太簡單了,但是我用小明同學給我的書看,真的太多了,但後就換了一本300多頁的書,隨便看了看,其實很多還是一樣的,主要是接口,包,特殊的類,等不太一樣。看書實在是沒意思呀,然後就讓小明給我兩個例子看,一個是他寫的計算器,一個是別人寫得日曆。然後我做了一些修改。

    從看懂這兩個例子來說,我這是爲自己以後編程提供方法,不是講具體的編碼,後面會附代碼。首先,我覺得,如果你是在看別人代碼的話,就一定要做的事是,把人家的所有的操作方法收起來,只留下聲明的第一行,這樣代碼長度也許就第一頁的若干聲明。爲什麼這樣做呢,因爲這樣你就不會去看具體怎麼實現的,而是思考它的框架是什麼。這對你的設計也是一樣的吧,你不知道你要從哪裏開始下手,這時候你就可以分步做,第一步就是設計整體。比方說這兩個例子:計算器,你需要一個界面,這裏面有多少個鍵,顯示框;然後你要每個按鍵能夠有作用,對每個按鍵編程,同樣顯示部分也一樣。這就是一個思路,從這個思路,你可以清楚每一步你要做什麼,界面設計對初學者我來說是難點,其實現在想想,其實最簡單的部分,爲什麼這麼說呢,那是因爲我不熟悉,所以我不知道有那些界面可選,然後就是每種界面調用什麼樣的類成員方法來把界面完善,比方說,最初就有這段代碼我一直沒看懂,但是後來和小明探討了一下,頓時就發現,其實,這些都是弄好的了,就好比我學的STM32裏面的庫函數,每個函數都有自己的功能,但是,我現在不知道的就是這些函數是什麼,我要用那個,函數的參數怎麼設置等等問題,其實這些看似很難,但是是最沒有技術含量的,因爲你去百度,肯定有現成的,或者指導你怎麼設計的,但是我卻糾結了很久,真不該。

Container contentPane = getContentPane();//獲取容器
		contentPane.setLayout(null);
		Font f=new Font("宋體",Font.BOLD,30);
		Font p=new Font("宋體",Font.BOLD,25);
		
		display=new JTextField();
		display.setSize(350,30);
		display.setBounds(10,40,350,30);
	    display.setFont(new Font("宋體",Font.BOLD,20));
		contentPane.add(display);
		
		display1=new JTextField();
		display1.setSize(350,30);
		display1.setBounds(10,10,350,30);
	    display1.setFont(new Font("宋體",Font.BOLD,20));
		contentPane.add(display1);


           (哎,這個坑爹呀博客,不是會自動保存的麼,難道欺負我很久沒寫?我辛苦寫好的文章,結果只能看到上面這麼一點了,我又不想再重寫一遍,好煩,坑死了)

        算了,奔着學習的精神,簡單的再重寫一點點吧,真煩,都沒心情了。

        界面設計部分其實很簡單,但是也不能這麼說,因爲你覺得簡單是看人家寫好的,不懂的就直接百度這個操作函數是什麼意思,這個參數怎麼設置等等,但是如果不給你參考,你自己寫,也許就沒那麼簡單了,其實還是比價麻煩的,不過別人都寫好了,你就沒必要那麼糾結了,所以只要會用就好,我也就不多說了,也不把日曆的界面設計也拿來說了,真的沒心情再重寫一遍了,白白辛苦打了那麼,下次我先在word裏面寫好了,再複製過來吧,這個網頁版的太菜了,坑我。

       

       其實,每個設計的東西都是有複雜的地方,這也就是爲什麼讓你自己思考怎麼做,你就是不會,或者考慮不全面,或者沒有特別好的方法而是很笨的方法。不多說,直接說我修改的小明寫的計算器,因爲他寫的計算器有很多bug,比方說最大的問題就是不能實現連續運算,如"1+1+1="這個他就不行,只能計算最後的“1+1=”,這是爲什麼呢,因爲他設計的時候只設計了三個全局變量,first,second,mark分別表示第一次讀取,第二次讀取和加減乘除的標誌,當讀取多餘兩個數時,就只能讀取最後兩位代替,然後求結果,這就hibug。爲了解決這個bug,其實也不復雜,就是在遇到第二次符號的時候,先把之前的式子“a#b”給計算出來,然後在把值賦給first,然後把first顯示出來,也就編程了這個式子“first#”,這樣就可以連續運算了,但是,其實沒這麼簡單,在具體實現的時候,這裏面有個技巧,就是字符串和float型之間的相互轉換問題,首先你顯示的是字符串,但是計算的是float,所以,你要先把字符串轉化成float,然後賦給first,但是你又要把first顯示出來,因此又要把她轉化成字符串,這就是比較複雜的地方,要用到first = first+Float.parseFloat(str);和String Str = String.valueOf(first);這兩個轉換函數。其他的方面就沒什麼特別可說了,最主要的是我其實剛纔寫了一遍,但是,不想說了、、、

       日曆怎麼說呢,其實不是我寫的,但是,不得不吐槽下,網上的99%都是錯誤的程序或者英語句子,1%是對的,還只是結構什麼的是對的。所以,我運行了他的程序,不能正確顯示,然後我找這個bug找了好久好久,主要是不熟悉,畢竟才學習了三天,沒辦法,然後才發現,是Calendar的set的問題,主要是這個set有點類似重構,參數選擇有講究,但是我沒注意,所以一直有問題,之後修改之後就好了。這個程序的重點和計算器不同,界面設計部分就不說了,不過他們界面的類是繼承不同的,畢竟計算器的按鍵是要有響應的,但是日曆顯示的是不容許修改的。這個日曆的重點其實是怎麼把當月的日子顯示出來,這個直接調用Calendar類的操作方法和成員變量其實就是可以讀取系統的時間的,但是這只是一個月的,也就是當月的,但是我要的是很多月的,這是怎麼做到的呢?其實也很簡單,就是利用面向對象這個概念。你可以把當月的當着一個對象,前面一個月的也當對象,後面一個月也當一個對象,這樣你就有很多很多對象了,這些對象你丟是可以用Calendar類來獲取時間,所以,你要做的就是設置當你的按鍵按下,就是增減,然後切換對象,然後顯示對象,但是這是一個抽象的概念,就是你每次其實只要用到一個對象,所以你不用把所有對象對定義出來,你用到那個再定義出來,調用就可以了。

 

       其實,從這兩個例子,我想說的有這麼幾點。首先,你如果是看別人程序的話,最好只看他聲明瞭那些操作函數和成員變量,而不是直接看操作函數的實現,爲什麼呢?你這麼宏觀的看,可以給你一個清晰的思路,告訴你,這部分是實現界面設計的,這部分是處理函數,這是初始化部分,這是啥,那是啥、、、這樣當你要做一個東西的時候,你也具體的思路,就是你首先會設計一個界面,然後用到那些東西,然後是處理部分,然後是啥等等,你並不關心你的界面設計,在你最初思路的時候,直到你具體要寫那部分代碼的時候,你再去考慮,這樣很有效率,思路也很清晰,而且查找bug也是很快速的定位。其次,程序的關鍵部分往往是你考慮的不全面的部分,而不是界面設計,之類的,也可以說往往關鍵部分是算法部分,就是你怎麼讓界面裏面的button或者成員變量之間的關係處理好那部分,這纔是你要思考的重點部分,至於界面部分,你可以copy別人的代碼,修改下就成了你的,除非你要設計全新的部分。最後,多用已有的包和類,這樣做的目的就是程序可讀性很好,而且,你可以減少工作量。操作已有的東西,這個看起來很簡單,但是其實,前提是你要知道什麼已有,還要知道,怎麼用,其實學的東西還很多,比方說界面設計,這些都是已有的,但是我隨便畫個草圖,你就能代碼寫出來,這是要相當水平的。

       老師讓這幾天看完java一本語法書,從這兩個例子來學習效果來看,其實java的部分,我還是有很多不懂的,明天還要好好看書,不打算看例子了,思想就在哪裏,具體的案例,具體分析,現在是我沒有什麼基礎,所以還是要多看基礎語法書。不過我打算看完明天一天就不看了,以後用到java的地方太多,畢竟我要Android開發,所以,直接弄Android吧,以後慢慢來學習java,爲了進度,所以要加快步伐。

       計算器源代碼:

package java0;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JFrameCalculator extends JFrame{
	private JButton [] button=new JButton[17];
	private  JTextField display1 ;
	private  JTextField display ;//JTextField是單行文本輸入或者顯示框,JTextArea是多行的。
//密碼輸入框則只有一種 (JPasswordField),是 JTextField 的子類,它們的主要區別是 不會顯示出用戶輸入的東西,只會顯示出程序員設定的一個固定字符,比如 '*'。
	private  float first=0;     //
	private  float second=0;
	private  int mark=0;
	private  float result=0;
    //private  float multiply=0;
	//private  float divide=0;
	
	public JFrameCalculator(){
		setTitle("Calculator簡易計算器");
		setSize(400,400);
		init();
		/*ImageIcon img =new ImageIcon(getClass().getResource("IMG.JPG"));
		 JLabel background = new JLabel(img);
		 background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
		 add(background); */
		Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
	   	setLocation((d.width-getWidth())/2,(d.height-getHeight())/2);
	   	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	   	setResizable(false);     
	}
	
	public float equal(String str){
		switch(mark){
		case 0:first = first+Float.parseFloat(str);break;
		case 1:first = first-Float.parseFloat(str);break;
		case 2:first = first*Float.parseFloat(str);break;
		case 3:first = first/Float.parseFloat(str);break;
		}
		return first;
	}
	
	public void init(){
		Container contentPane = getContentPane();//獲取容器
		contentPane.setLayout(null);
		Font f=new Font("宋體",Font.BOLD,30);
		Font p=new Font("宋體",Font.BOLD,25);
		
		display=new JTextField();
		display.setSize(350,30);
		display.setBounds(10,40,350,30);
	    display.setFont(new Font("宋體",Font.BOLD,20));
		contentPane.add(display);
		
		display1=new JTextField();
		display1.setSize(350,30);
		display1.setBounds(10,10,350,30);
	    display1.setFont(new Font("宋體",Font.BOLD,20));
		contentPane.add(display1);
		
		button[0]=new JButton("1");
		button[1]=new JButton("2");
		button[2]=new JButton("3");
		button[3]=new JButton("+");//3加
		button[4]=new JButton("4");
		button[5]=new JButton("5");
		button[6]=new JButton("6");
		button[7]=new JButton("-");//7減
		button[8]=new JButton("7");
		button[9]=new JButton("8");
		button[10]=new JButton("9");
		button[11]=new JButton("*");//11乘
		button[12]=new JButton(".");
		button[13]=new JButton("0");
		button[14]=new JButton("/");//14除
		button[15]=new JButton("=");
		button[16]=new JButton("DE");
		
		for(int i=0;i<12;i++){
			button[i].setSize(80,60);
			button[i].setBounds(16+92*(i%4),85+72*(i/4),80,60);
			button[i].setFont(f);
			contentPane.add(button[i]);
		}
		for (int i=12;i<button.length;i++) {
			button[i].setSize(60,60);
			button[i].setBounds(16+75*(i-12),90+72*3,62,50);
			button[i].setFont(p);
			contentPane.add(button[i]);
		}
		
		button[16].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				first = 0;
				second = 0;
				mark = 0;
				display1.setText("");
				display.setText("");
			}
		});
		
		button[15].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str=display.getText();
				//String[] strarray=str.split(" "); 
				//for (int i=0;i<strarray.length;i++){
					//System.out.println("第二次輸入的字符串是:"+strarray[i]);
				try{
					 second = Float.parseFloat(str);
					}catch(NumberFormatException e1){}
				switch(mark){
				case 0:result=first+second;display1.setText(first+"+"+second+"=");break;
				case 1:result=first-second;display1.setText(first+"-"+second+"=");break;
				case 2:result=first*second;display1.setText(first+"*"+second+"=");break;
				case 3:result=first/second;display1.setText(first+"/"+second+"=");break;
				}
				display.setText(""+result);
				first = 0;
				second = 0;
				mark = 0;
			}
		});

		button[0].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				//display.setText("");
				String str0=display.getText();
				String str1=button[0].getText();
				String Str=display1.getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[1].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				//display.setText("");
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[1].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[2].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				//display.setText("");
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[2].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[3].addActionListener(new ActionListener(){//加法計算
			@Override
			public void actionPerformed(ActionEvent e){
				String str=display.getText();
				display1.setText(str);
				try{
					 first = equal(str);	
					}catch(NumberFormatException e1){}
				String Str = String.valueOf(first);
				mark=0;
				display.setText("");
				display1.setText(Str+"+");
			}
		});
		button[4].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[4].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[5].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[5].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[6].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[6].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[7].addActionListener(new ActionListener(){//7減
			@Override
			public void actionPerformed(ActionEvent e){
				String str=display.getText();
				display1.setText(str);
				try{
					first = equal(str);
					}catch(NumberFormatException e1){}
				String Str = String.valueOf(first);
				mark=1;
				display.setText("");
				display1.setText(Str+"-");
			}
		});
		button[8].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[8].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[9].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[9].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[10].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[10].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[11].addActionListener(new ActionListener(){//乘法運算
			@Override
			public void actionPerformed(ActionEvent e){
				String str=display.getText();
				display1.setText(str);
				try{
					first = equal(str);
					}catch(NumberFormatException e1){}
				String Str = String.valueOf(first);
				mark=2;
				display.setText("");
				display1.setText(Str+"*");
			}
		});
		button[12].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[12].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[13].addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e){
				String str0=display.getText();
				String Str=display1.getText();
				String str1=button[13].getText();
				display.setText(str0+str1);
				display1.setText(Str+str1);
			}
		});
		button[14].addActionListener(new ActionListener(){//除法運算
			@Override
			public void actionPerformed(ActionEvent e){
				String str=display.getText();
				display1.setText(str);
				try{
					first = equal(str);
					}catch(NumberFormatException e1){}
				String Str = String.valueOf(first);
				mark=3;
				display.setText("");
				display1.setText(Str+"÷");
			}
		});
	}
	
  public static void main(String[] args){
	  JFrameCalculator  calculator=new JFrameCalculator();
	  calculator.setVisible(true);
  }
}


日曆源代碼:(這個程序不是我寫的,但是我修改了下,也算是尊重下人家的版權)

package java1;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class PerpetualCalendar {
    private CalendarFrame view;
    private Calendar calendar = Calendar.getInstance();
    private SimpleDateFormat sdf = 
new SimpleDateFormat("yyyy年MM月");
    public void incMonth() {
        calendar.add(Calendar.MONTH, 1);
        updateCalendar();
    }
    public void decMonth() {
        calendar.add(Calendar.MONTH, -1);
        updateCalendar();
    }
    public PerpetualCalendar() {
        view = new CalendarFrame(this);
        updateCalendar();
    }
    private void updateCalendar() {
        int maxDay =
        		calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int miniDay =
        		calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
        int currentDay = -1;
        Calendar c = Calendar.getInstance();
        if (c.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)
                && c.get(Calendar.MONTH) ==
 calendar.get(Calendar.MONTH)) {
            currentDay = c.get(Calendar.DATE);
        }
	    c.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),1);
		int begin = c.get(Calendar.DAY_OF_WEEK);
        view.setCalendar(begin, maxDay, currentDay);
        view.setYearAndMonth(sdf.format(calendar.getTime()));
    }
    public void show() {
        view.setVisible(true);
    }
    public static void main(String[] args) throws Exception {
        for (LookAndFeelInfo info :
 UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
        PerpetualCalendar calendar = new PerpetualCalendar();
        calendar.show();
    }
}
package java1;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class CalendarFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private PerpetualCalendar calendar;
    private JLabel yearAndMonth;
    private JLabel monthInc;
    private JLabel monthDec;
    private JLabel[] weeks = { 
    		new JLabel("日"), 
    		new JLabel("一"),
            new JLabel("二"),
            new JLabel("三"), 
            new JLabel("四"), 
            new JLabel("五"),
            new JLabel("六"), };
    private JLabel[] days = new JLabel[42];
    public void setYearAndMonth(String yearAndMonth) {
        this.yearAndMonth.setText(yearAndMonth);
    }
    public void setCalendar(int begin, int maxDay, int currentDay)
 {
        for (int i = 0; i < days.length; i++) {
            days[i].setText("");
            days[i].setForeground(Color.BLACK);
        }
        for (int i = 1; i <= maxDay; i++) {
            String dateStr = (i <= 9 ? " " + i : "" + i);
            days[begin + i - 2].setText(dateStr);
            if (currentDay == i) {
                days[begin + i - 2].setForeground(Color.RED);
            }
        }
    }
    public CalendarFrame(PerpetualCalendar calendar) {
        this.calendar = calendar;
        setTitle("PerpetualCalendar");
        setSize(400, 350);
        init();
        Dimension d =
 Toolkit.getDefaultToolkit().getScreenSize();
        setLocation((d.width - getWidth()) / 2, 
(d.height - getHeight()) / 2);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
    }
    private void init() {
        Container contentPane = getContentPane();
        contentPane.setLayout(null);
        for (int i = 0; i < weeks.length; i++) {
            weeks[i].setBounds(40 + i * 50, 50, 50, 30);
            if(i==0||i==6) weeks[i].setForeground(Color.BLUE);
            contentPane.add(weeks[i]);
        }
        for (int i = 0; i < days.length; i++) {
            days[i] = new JLabel("");
            days[i].setBounds(40 + (i % 7) * 50, 90 + (i / 7) * 30,
 50, 30);
            contentPane.add(days[i]);
        }
        monthInc = new JLabel(">>");
        monthInc.setBounds(250, 20, 20, 20);
        contentPane.add(monthInc);
        monthDec = new JLabel("<<");
        monthDec.setBounds(130, 20, 20, 20);
        contentPane.add(monthDec);
        yearAndMonth = new JLabel("");
        yearAndMonth.setBounds(165, 20, 80, 20);
        contentPane.add(yearAndMonth);
        monthInc.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                monthInc.setForeground(Color.RED);
            }
            @Override
            public void mouseExited(MouseEvent e) {
                monthInc.setForeground(Color.BLACK);
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                calendar.incMonth();
            }
        });
        monthDec.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                monthDec.setForeground(Color.RED);
            }
            @Override
            public void mouseExited(MouseEvent e) {
                monthDec.setForeground(Color.BLACK);
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                calendar.decMonth();
                
            }
        });
    }
}


簡單的運行結果截圖:



    



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