好久沒寫博客了,看最近的一篇博客還是爲她做光立方的時候的文章,這期間,其實我學習了好多,很雜,都不知道說什麼好,其實還是有很多不錯的東西可以寫的,但是一直都比較懶,不想寫,今天突然想寫,也不是因爲今天清明節,只是,最近看到傻博一直不斷更新他的博客,讓我有一種使命感,我不該這麼墮落。
其實,這期間,我做過紅外遙控器,但是,怎麼說呢,不算很成功,代碼一直調得不好,也就不是很想寫,其實,做那個心得還是很多的,尤其是調代碼的時候,很多人給了我很多寶貴的意見,其中就有皮皮同學告訴我的最簡單的按鍵檢測程序,我當時看了下,真的有很多,很出色的程序,一直想寫的,但是,太懶了。
後來吧,其實有看過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();
}
});
}
}
簡單的運行結果截圖: