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();
                
            }
        });
    }
}


简单的运行结果截图:



    



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值