您的位置:首页 > 编程语言 > Java开发

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

}
});
}
}


简单的运行结果截图:




   

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息