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(){@Overridepublic void actionPerformed(ActionEvent e){first = 0;second = 0;mark = 0;display1.setText("");display.setText("");}});button[15].addActionListener(new ActionListener(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){//加法計算@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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減@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){//乘法運算@Overridepublic 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(){@Overridepublic 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(){@Overridepublic 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(){//除法運算@Overridepublic 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() {@Overridepublic void mouseEntered(MouseEvent e) {monthInc.setForeground(Color.RED);}@Overridepublic void mouseExited(MouseEvent e) {monthInc.setForeground(Color.BLACK);}@Overridepublic void mouseClicked(MouseEvent e) {calendar.incMonth();}});monthDec.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {monthDec.setForeground(Color.RED);}@Overridepublic void mouseExited(MouseEvent e) {monthDec.setForeground(Color.BLACK);}@Overridepublic void mouseClicked(MouseEvent e) {calendar.decMonth();}});} }
簡單的運行結果截圖:
????
總結
以上是生活随笔為你收集整理的java学习笔记--计算器和日历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS W3C 统一验证工具
- 下一篇: 长链剖分总结