Java知识整理学习-1.图形界面

    从来没有系统地整理过Java的学习,虽说做过两个Java的项目,但是基本上属于随用随学,脑子里还是比较混乱的。
使用Java的机会一直比较少,随着时间的逝去,估计残存的Java印象也会逐渐淡去。所以现在想趁有时间慢慢整理一下
自己的Java知识,加深一下印象,最好能够使常用内容成为一种本能,不至于白做白学。
    说是整理,其实也是随兴所至,不会从Java的语法等基础知识开始整理。从自己最感兴趣的地方开始,在整理和学习的
过程中,遇到问题再逐渐扩展,以免自己早早地就失去了动力和兴趣。比较而言,从语法等基础知识开始学习,应该会比较
轻松,更符合人们认识事物的规律,这是学校的学习方式,也更利于奠定坚实的基础。而现在我采取的方式,在工作后使用的
机会更多,因为通常是工作需要,没有太多的时间和精力去从头细致地学习,只能是用什么学习什么,往往见效快但是不牢靠。
如果不整理,并且再次使用的机会比较少的话,学会的东西就会悄悄溜走。
    对于我这种比较懒散的人来说,真要对自己的东西进行整理还是有点儿压力的,呵呵。因为也许坚持不了多久就没后续了,
所以考虑一下干脆先放在网上,这样能经常看到,也好提醒自己,还有事儿没有做完。

一直想用Java做一个有界面的小东西,不为可以有特别的用途,主要是用来学习Java,但是没什么好的方案。
趁这次整理的机会,也不想再等下去了,就顺着感兴趣的点儿整理和学习了,等了解的多了,也许就有思路了。
    想编写一个有界面的东西,就需要会使用Swing,所以就先从这里开始。学习最好的方法就是实践。也不需要特别复杂,
还是从HelloWorld开始:)。
    首先需要创建一个带有main方法的类SHelloWorld,编辑工具使用eclipse,这步没什么单独,使用eclipse的项目创建向导
就全部完成了。接下来就需要在其中追加控件和操作了。
    对Swing控件和API了解的不是很多,看代码的时候没有问题,知道是做什么用的,但是到自己来写代码的时候,就不知道如何
下手了。但是最基本的还是知道的,就是想要放控件,首先需要有个画布,就是Java中的框架(frame),使用Swing的话,就
使用JFame,然后准备在上面添加一个按钮,使用JButton,最后将frame显示就可以了。
    于是,初版代码就出来了。
import javax.swing.JButton;
import javax.swing.JFrame;

public class SHelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       JFrame myframe = new JFrame("HelloWorld");
       JButton mybtn = new JButton("Hello");

       myframe.add(mybtn);
       myframe.setVisible(true);
      
    }
}


    执行的结果就比较令人郁闷了,在屏幕的左上角出现了一个窗体,基本上就只能看到一个标题栏,内容和追加的按钮统统
看不见。将窗体拖动放大,才看到了上面的按钮。这时候才想到原来控件还需要定义位置的大小的。
    修改代码,追加控件的大小和位置的设定处理。
import javax.swing.JButton;
import javax.swing.JFrame;

public class SHelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       JFrame myframe = new JFrame("HelloWorld");
       JButton mybtn = new JButton("Hello");

       myframe.setBounds(100, 100, 400, 600);
       mybtn.setBounds(10, 10, 20, 30);

       myframe.add(mybtn);
       myframe.setVisible(true);
      
    }
}


    这下好了,都可以正常看到了。然后就是追加按钮的动作了。应该是需要实现某个接口,不记得了。没办法,
查帮助文档吧。在整理学习的过程中,文档是比不可少的。找个一个觉得合适的接口:ActionListener。
就是它了。让类实现该接口,追加接口的方法actionPerformed()。
    在给按钮添加监听事件的时候,出了点小问题。addActionListener方法的参数中使用new ActionListener()方式,
结果里面也出现了actionPerformed方法。这样子代码中存在了两个同名的方法,虽说作用域不同,并且不影响程序的运行。
但是这意味这在使用监听事件时出现了误解。
    如果actionPerformed方法作为new ActionListener()的一部分出现,那说明类SHelloWorld根本就不需要实现ActionListener
的接口,也就是说外部的actionPerformed方法没必有出现。于是删除了类部分的接口的实现,确认结果正常。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SHelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       JFrame myframe = new JFrame("HelloWorld");
       JButton mybtn = new JButton("Hello");
      
       myframe.setBounds(100, 100, 400, 600);
       mybtn.setBounds(10, 10, 20, 30);
       mybtn.addActionListener(new ActionListener() {
       
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println("HelloWorld!");
            System.exit(0);
        }
    });
       myframe.add(mybtn);
       myframe.setVisible(true);
      
    }
}


    但是,这种形式的代码让我觉得不太舒服,就是一个方法的具体实现出现在了另外一个方法的参数中。印象中应该有
在外面实现该接口方法的处理方式。于是查了一下,果然有另外的实现方法,就是由类实现ActionListener接口,并实现
接口的方法,并把自己作为参数传递给addActionListener方法。于是修改成如下的样子:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SHelloWorld implements ActionListener{

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       JFrame myframe = new JFrame("HelloWorld");
       JButton mybtn = new JButton("Hello");
      
       myframe.setBounds(100, 100, 400, 600);
       mybtn.setBounds(10, 10, 20, 30);
       mybtn.addActionListener(this);
       myframe.add(mybtn);
       myframe.setVisible(true);
      
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        System.out.println("HelloWorld!");
        System.exit(0);
    }
}


    此时,出现了一个错误,mybtn.addActionListener(this);提示不能使用静态内容作为参数。估计是因为类中存在
main方法才不能使用this作为参数。那就换一种方式,不用this,声明一个该类的实例,应该就可以使用了。
于是修改成下面的代码,编译通过,执行成功。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class SHelloWorld implements ActionListener{

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       JFrame myframe = new JFrame("HelloWorld");
       JButton mybtn = new JButton("Hello");
       SHelloWorld me = new SHelloWorld();
      
      
       myframe.setBounds(100, 100, 400, 600);
       mybtn.setBounds(10, 10, 20, 30);
       mybtn.addActionListener(me);
       myframe.add(mybtn);
       myframe.setVisible(true);
      
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        System.out.println("HelloWorld!");
        System.exit(0);
    }
}


你可能感兴趣的:(Java知识整理学习-1.图形界面)