虽然目前Java算不上前端开发的主力,但是作为Java入门基础的一部分,学习Java的GUI编程还是有必要的,而且可以做出一些小且有趣的图形程序来提高学习热情。本篇学习总结均为一个Beginner的笔记与心得,如有描述不到或错误之处,敬请指正。

  目录:

  1. JavaGUI主要开发工具 -- Swing类库的诞生与功能
  2. 创建JFrame框架
  3. 在框架中添加组件JComponent

  1. JavaGUI主要开发工具 -- Swing类库的诞生与功能

  一个合格的Java Developer,不仅要掌握技术,还要有一定的Java历史背景知识储备。所以先简要介绍一下用于JavaGUI开发的主要类库:Swing。

  在Java 1.0时代便有设计GUI的基本类库Abstract Window Toolkit,简称AWT。AWT库工作原理是将处理用户界面元素的任务委派给目标平台(操作系统)的本地GUI工具箱,由本地GUI工具箱负责用户界面元素的创建和动作。这种工作方式是有利也有弊,先说下利处:

  • 处理速度可能要快一点。
  • 可以适应不同的平台,“一次编写,随处使用”。

  弊处:

  • 观感依赖于目标平台。
  • 有些平台并没有像Windows或Mac这样丰富的界面组件(早期)。所以把AWT的设计工作限制在了“最小公分母”。
  • 不同平台存在不同的bug。

  1996年,Netscape创建了另一种GUI库IFC,他的工作方式是 将用户界面组件绘制在空白窗口上,而对等体只需要负责创建和绘制空白窗口。Sun和Netscape合作并完善了这种方式,创建了名为Swing的用户界面库,这便是Swing的诞生

  但是Swing并没有完全取代AWT,到目前Java SE 8中依旧有AWT与Swing两个功能类库:

  • AWT import java.awt (java包为核心包)
  • Swing import javax.swing (javax包为功能扩展包)

  Swing没有完全取代AWT的原因是:Swing是基于AWT的架构之上,Swing仅仅是提供了能力更强大的用户界面组件。在Swing编写的程序中,还是需要AWT进行事件处理。简单说就是,Swing是用户界面类,AWT是底层机制

AWT和Swing中框架和组件类的继承层次

  2.创建JFrame框架

  Frame意为框架,也就是最顶层的窗口,可以在框架里添加组件。我们创建一个窗口首先要创建一个框架。

JFrame的内部结构

  

  注:Swing组件类都以“J”开头,如 JButton,JFrame等,AWT组件不带“J"。如果Swing组件和AWT组件一起用可能会导致视觉和行为的不一致。

  现在,我们来创建一个空框架:

  1. package simpleFrame;
  2.  
  3. //会用到awt和swing的类,先import。
  4. import java.awt.*;
  5. import javax.swing.*;
  6.  
  7. //创建一个SimpleFrame的类,里面只有一个main函数,main函数里有个事件分派线程。
  8. public class SimpleFrame {
  9. public static void main(String[] args) {
  10. EventQueue.invokeLater(new Runnable() {
  11. public void run() {
  12. JFrame frame = new SizedFrame(); //new一个SizeFrame对象给frame变量管理,这便有了框架。SizeFrame是JFrame的子类。
  13. frame.setTitle("SimpleFrame"); //设置框架的标题.
  14. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设定关闭按钮。
  15. frame.setVisible(true); //设定框架可见。
  16. }
  17. });
  18. }
  19. }
  20.  
  21. //其实到这里为止,我们可以在第12行直接new一个JFrame交给frame,但是JFrame默认框架大小是0×0,没什么实际意义。
  22. //所以我们选择继承JFrame做一个子类起名SizedFrame,在这个类里做一个构造器来设定框架的大小。
  23. class SizedFrame extends JFrame {
  24.  
  25. //构造器
  26. public SizedFrame() {
  27.  
  28. //下面四行代码为获取你pc屏幕的高度和宽度,交给int变量screenHeight和screenWidth。
  29. Toolkit kit = Toolkit.getDefaultToolkit();
  30. Dimension screenSize = kit.getScreenSize();
  31. int screenHeight = screenSize.height;
  32. int screenWidth = screenSize.width;
  33.  
  34. //setSize方法由父类Component类(GUI对象的祖先)继承而来。设定框架长宽都为屏幕的1/2.
  35. //setLocationByPlatform由Window类(Frame类的父类)继承而来。由平台(操作系统)来选择一个合适的显示位置。
  36. setSize(screenWidth/2,screenHeight/2);
  37. setLocationByPlatform(true);
  38.  
  39. //setIconImage方法由Frame类继承而来,设置框架图标。
  40. Image img = new ImageIcon("icon.gif").getImage();
  41. setIconImage(img);
  42.  
  43. //当然,事件分派线程里的设定标题、设定关闭按钮、和设定框架可见操作,也可以放在构造器里来做。
  44. }
  45. }

  Windows 10下运行:

  3.在框架中添加组件JComponent

  在Java中,Frame被设计成放置组件的容器,可以将用户界面元素放置其中,JComponent就是一种组件(component本身就意为组件)。所以,现在我们可以在JComponent中书写一些文字,并将其放置在Frame中:

  1. package notHelloWorld;
  2.  
  3. import java.awt.*;
  4. import javax.swing.*;
  5.  
  6. public class NotHelloWorld {
  7. public static void main(String[] args) {
  8. EventQueue.invokeLater(new Runnable() {
  9. public void run() {
  10. JFrame frame = new NotHelloWorldFrame();
  11. frame.setTitle("NotHelloWorld");
  12. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. frame.setVisible(true);
  14. }
  15. });
  16. }
  17. }
  18.  
  19. class NotHelloWorldFrame extends JFrame {
  20.  
  21. //构造器
  22. public NotHelloWorldFrame() {
  23. //在框架中add组件并pack。
  24. //当然也可以不必扩展JFrame类,可以直接在第10行new一个JFrame对象,并在其后add组件。
  25. //这里我们没有设置框架的长宽,因为组件JComponent有长宽,框架会根据组件的大小调整自己的长宽。
  26. add(new NotHelloWorldComponent());
  27. pack();
  28. }
  29. }
  30.  
  31. class NotHelloWorldComponent extends JComponent {
  32. public static final int MASSAGE_X = 75;
  33. public static final int MASSAGE_Y = 100;
  34.  
  35. private static final int DEFAULT_WIDTH = 300;
  36. private static final int DEFAULT_HEIGHT = 200;
  37.  
  38. //必须覆盖paintComponent方法才能让组件自己把自己画出来。
  39. //这个方法需要一个Graphics对象,在Java中,所有绘制必须使用Graphics对象。
  40. public void paintComponent(Graphics g) {
  41. //画出一个字符串,并设置自组件左上角(0,0)开始显示的位置。
  42. g.drawString("Not a 'Hello, World!' program.", MASSAGE_X, MASSAGE_Y);
  43. }
  44.  
  45. //还要覆盖此方法以确定组件的首选长宽。
  46. public Dimension getPreferredSize() {
  47. return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
  48. }
  49. }

  运行:

Java基础学习总结 -- 图形用户界面GUI的更多相关文章

  1. AWT是Java基础类 (JFC)的一部分,为Java程序提供图形用户界面(GUI)的标准API

    抽象窗口工具包 (Abstract Windowing Toolkit) (AWT)是Java的平台独立的窗口系统,图形和用户界面器件工具包. AWT是Java基础类 (JFC)的一部分,为Java程 ...

  2. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  3. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  4. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  5. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  6. php 图形用户界面GUI 开发

    php 图形用户界面GUI 开发 一.下载指定系统扩展 1 2 http://pecl.php.net/package/ui http://pecl.php.net/package/ui/2.0.0/ ...

  7. java基础学习总结——开篇

    java是我学习的第一门编程语言,当初学习java基础的时候下了不少功夫,趁着这段时间找工作之际,好好整理一下以前学习java基础时记录的笔记,当作是对java基础学习的一个总结吧,将每一个java的 ...

  8. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  9. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

随机推荐

  1. 每天一个linux命令(18):locate 命令

    locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...

  2. Spring学习记录(三)---bean自动装配autowire

    Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...

  3. python网络编程——IO多路复用之epoll

    1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念,一个流 ...

  4. CSS之flex布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. Centos 源码安装zabbix 2.4.5

    Zabbix简介 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.zabbix能监视各种网络参数,保证服务器系统 的安全运营:并提供柔软的通知机制以让系统管 ...

  6. OpenCascade MeshVS Usage

    OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...

  7. 【转】Linq Group by

    http://www.cnblogs.com/death029/archive/2011/07/23/2114877.html 1.简单形式: var q = from p in db.Product ...

  8. DOM-Text类型、Comment类型、CDATASection类型、DocumentType类型、DocumentFragment类型、Attr类型

    Text类型 文本节点由Text类型表示,包含的是可以照字面解释的纯文本内容.Text节点具有以下特征: nodeType的值为3 nodeName的值为"text" nodeVa ...

  9. Javascript中关键参数this浅析

    自从接触javascript以来,对this参数的理解一直是模棱两可.虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪. 但对于this参数,确实会让人产生很多误解.那么this参数到底 ...

  10. T-Sql学习系列完结

    T-Sql(一)简单语法 T-Sql(二)事务(Transaction) T-Sql(三)存储过程(Procedure) T-Sql(四)表关联和视图(view) T-Sql(五)xml操作 T-Sq ...