转眼间一年过去了,自从去年毕业以后博客就没怎么更新过了,一来是因为工作忙没有太多的时间去写,二来可能自己变得比较懒惰,所以就放下了。最近突然想继续整理下Java方面的东西,所以就接着写了。为什么选择Java GUI编程?说实话这块知识在实际工作中用的比较少,可以说非常之少。但是我觉得既然是Java语言的一块,我们就有必要去了解一下,再者有不少同学经常问我会不会讲下这方面的知识点,同时,研究这块内容有助于我们学习Java的基础知识,所以我们就来研究一下。本章系Java之美[从菜鸟到高手演变]系列之Java GUI 编程一,通过本周学习,我们会了解Java GUI的基本知识。
一、Java GUI编程的现状
所谓GUI,即Graphical User Interface(图形用户接口),Java GUI说白了就是用Java进行图形化程序设计,就是我们常说的桌面应用、C/S模式的程序。比如QQ,迅雷,酷狗音乐等等。其实Java在这方面并不是长项。小型桌面程序现在一般都采用C#来编写,大型桌面程序和游戏考虑到性能问题,都采用C++。所以,很少有企业有这方面的用人需求,目前为止我好像只见过IBM会招聘eclipse插件开发的,会涉及到GUI编程。所以,对于这部分知识,我们尽量熟悉大部分控件的用法,进而去弄懂它的实现原理,就够了。目前,Java中采用Swing库来实现GUI编程,Swing是建立在AWT上的新类库,大大简化了图形界面的开发,这里我就不去说AWT、Swing概念之类的东西,有兴趣的同学自己去搜索一下。
二、AWT
简单提一下AWT相关的东西,AWT即Abstract Window Toolkit(抽象窗口工具包),是Java中用来编写图形用户界面的基本工具。由于Java是一种独立于平台的程序设计语言,但GUI却往往依赖于特定平台的,因此,Java采用了相应的技术使得AWT能提供给应用程序独立于机器平台的接口,这保证了同一程序的GUI在不同机器上运行具有类似的外观,但不一定展现的完全一致。其实为了尽量统一界面,AWT提供的图形功能其实是各个系统能够提供的图形功能的交集,这就很大程度上为了达到统一的界面而牺牲功能。AWT中很多方法利用C/C++实现,包含本地方法,所以通常称为重量级控件。
三、Swing
Swing实现原理的不同,很好的解决了AWT的不足。纯Java代码开发,丰富的类库机组件,既解决了跨平台的问题,又可以满足各种需要,所以才会被用户接受。由于在Swing中没有使用使用本地方法实现图形功能,所以通常称为轻量级控件。下面是Swing类库中包的名称以及简介(摘自《Java Swing图形界面开发》)。
先做简单的了解,后面我会尽可能多的去分析。
四、布局管理器
我觉得在学习具体控件之前,应该首先了解Swing布局管理器。因为布局是整个应用程序的整体框架,所以我们先看看Swing中的布局管理。
有过图形界面开发的同学知道,实际的应用中需要灵活的运用布局知识,有时甚至需要多个嵌套,才能满足需求,所以一定要把这几个布局的特点牢牢掌握。下面我简单的写几个例子说明一下,关于详细的参数,还请大家自己在实际操作中多多练习。
1. BorderLayout
简单的上下左右中结构,容易懂。
package org.java.adam.swing.layout;import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class BorderLayoutTest {public static void main(String[] args) {JFrame f = new JFrame("BorderLayout Test");f.setSize(500, 300);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setVisible(true);JPanel p = new JPanel();f.setContentPane(p);JButton b1 = new JButton("上");JButton b2 = new JButton("下");JButton b3 = new JButton("左");JButton b4 = new JButton("右");JButton b5 = new JButton("中");BorderLayout by = new BorderLayout();f.setLayout(by);p.add(b1, "North");p.add(b2, "South");p.add(b3, "West");p.add(b4, "East");p.add(b5, "Center");}}
运行结果:
2. FlowLayout
package org.java.adam.swing.layout;import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class FlowLayoutTest {public static void main(String[] args) {JFrame f = new JFrame("FlowLayout Test");f.setSize(500, 300);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setVisible(true);JPanel p = new JPanel();f.setContentPane(p);JButton b1 = new JButton("上");JButton b2 = new JButton("下");JButton b3 = new JButton("左");JButton b4 = new JButton("右");JButton b5 = new JButton("中");FlowLayout by = new FlowLayout();f.setLayout(by);p.add(b1); // 不同于BorderLayout的地方 p.add(b1, "North")p.add(b2);p.add(b3);p.add(b4);p.add(b5);f.pack(); // 不同于BorderLayout的地方}
}
运行结果:
3. GridLayout
package org.java.adam.swing.layout;import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class GridLayoutTest {public static void main(String[] args) {JFrame f = new JFrame("FlowLayout Test");f.setSize(500, 300);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setVisible(true);JPanel p = new JPanel();f.setContentPane(p);JButton b1 = new JButton("1");JButton b2 = new JButton("2");JButton b3 = new JButton("3");JButton b4 = new JButton("4");JButton b5 = new JButton("5");JButton b6 = new JButton("6");JButton b7 = new JButton("7");JButton b8 = new JButton("8");JButton b9 = new JButton("9");GridLayout by = new GridLayout(3,3);f.setLayout(by);p.add(b1); p.add(b2);p.add(b3);p.add(b4);p.add(b5);p.add(b6);p.add(b7);p.add(b8);p.add(b9);f.pack();}
}
运行结果: