java学习笔记--计算器和日历
2014-04-05 20:00
555 查看
好久没写博客了,看最近的一篇博客还是为她做光立方的时候的文章,这期间,其实我学习了好多,很杂,都不知道说什么好,其实还是有很多不错的东西可以写的,但是一直都比较懒,不想写,今天突然想写,也不是因为今天清明节,只是,最近看到傻博一直不断更新他的博客,让我有一种使命感,我不该这么堕落。
其实,这期间,我做过红外遥控器,但是,怎么说呢,不算很成功,代码一直调得不好,也就不是很想写,其实,做那个心得还是很多的,尤其是调代码的时候,很多人给了我很多宝贵的意见,其中就有皮皮同学告诉我的最简单的按键检测程序,我当时看了下,真的有很多,很出色的程序,一直想写的,但是,太懒了。
后来吧,其实有看过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(); } }); } }
简单的运行结果截图:
相关文章推荐
- Java学习笔记之计算器
- java学习笔记--输出本月日历
- java设计模式学习笔记之计算器中的简单工厂模式
- JAVA学习笔记——日历类Calendar
- [java学习笔记]计算器dijkstra two-stack
- Android(java)学习笔记218:开发一个多界面的应用程序之人品计算器的简单实现
- JAVA学习笔记23——DateFormat类+Calendar类+实践:可视化日历
- 【Java学习笔记】继承,动态绑定与静态绑定
- 学习笔记:Java_IO(File)
- [JAVA学习笔记-85]java的concurrent包的整体认识
- java 设计模式学习笔记四 prototype模式
- Java学习笔记―第二章 初识Java
- Java.Web学习笔记 Hibernate
- 学习笔记 02计算器界面
- Java学习笔记18天---(8)
- java学习笔记
- Java学习笔记一:三步搭建Java开发环境
- Java Redis Jedis--学习笔记代码片断--序列化
- Java 学习笔记(不断更新)
- 黑马程序员-java基础学习笔记第二篇