GUI是什么?

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。
(上面的介绍来自百度百科,我说的肯定没他规范,有条件的可以查阅一些更好的百科……这里不能提怎么查,懂吧~~)

Java的GUI怎么样?

GUI方面的JFC(Java Foundation Classes,Java基础类库)包含AWT、Swing、辅助功能API、2D API以及拖放API。更强大JavaFX早已从JDK中剥离出去,下载JDK8以后的版本应该是不存在JavaFX的,而JavaFX甚至能提供给我们Web般的开发效果,这可比Swing好看太多了(AWT过于丑陋已经无法被拿来探讨),只不过也麻烦很多。

AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,称之为peers,当利用AWT编写图形用户界面时,实际上是在利用本地操作系统所提供的图形库。由于不同 操作系统的图形库所提供的样式和功能是不一样的,在一个平台上存在的功能在另一个平台上则可能不存在。为了实现Java语言所宣称的“一次编写,到处运行(write once, run anywhere)”的概念,AWT不得不通过牺牲功能来实现平台无关性,也即AWT所提供的图形功能是各种操作系统所提供的图形功能的交集。

Swing是一个用于开发Java应用程序用户界面的开发工具包。
以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event。

Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使开发者能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich Internet Applications(RIAs)。当前的JavaFX包括JavaFX脚本和JavaFX Mobile(一种运营于行动装置的操作系统),今后JavaFX将包括更多的产品。JavaFX Script编程语言(以下称为JavaFX)是一种declarative, statically typed(声明性的、静态类型)脚本语言。

官方套话,说白了就是AWT不仅特别丑还系统相关、重量级,Swing可以有更好的系统无关性、挺丑,JavaFX可能会的人不太多但是看着挺好看是真的……

GUI开发怎么学?

斗胆讲讲本蒟蒻这一块儿的学习经历。

我记得当时学Python进而入门编程的时候还被要求做Tkinter的GUI开发,当时就很困惑啊,这东西这么难受怎么学,程序员大佬们都是什么妖孽写得出这么厉害的UI?

后来学Java,惊觉输入输出的不便(感兴趣可以对比Java和Python在Console输入输出的麻烦程度,C/C++都比Java简单的多),忘了在哪里看到一个说法是Java的设计者们在最初打算让Java的开发者直接使用GUI而不是命令行(他们这些神仙可能高估了我等憨批),所以对Console的I/O支持的不是很好。而且在命令行的低端与web的复杂之间需要一个“中转站”,我便有幸结缘了丑陋的JavaGUI至今……

学习这个,开始是头铁硬编代码,一个Frame/JFrame硬着头皮用记事本敲上一个小时以上的代码,然后再cmd的编译错误下人工debug,一步一步建立起自己的GUI小程序,如今想来竟是这么有趣~~

学了一段时间,不敢妄言会多少,但是也用过AWT和Swing开发过有趣的Demo,见过JavaFX。回顾一番,对于GUI(特别是Java这块儿)的学习我有下面的看法:

  • 学习抓住核心三大核心内容:组件与容器布局设计与管理事件监听与处理(我觉得GUI核心就这三个东西)。
  • 勤于动手,多写多练。你不练习总是不能很好地掌握,这里代码动辄百行以上,凭空想象很难入门。
  • 养成先做设计的习惯,UI设计是学问,但我们即使是开发小的Demo也应该先画画图,进行调整以后再编码实现。
  • 学会看文档以及借助其他途径,自主的解决问题,因为很多问题的答案网上基本找不到。
  • 先学会自己写,但也要学会用插件工具加快开发速度(例如Window-Builder,真香)。
  • 积累,积累多了就有一定的经验了。你若问再积累呢?那就转Web呗哈哈……
  • 思维的转换很重要,要学习MVC设计模式(MVC模式和经典的23种设计模式不是一类东西),改变固有的命令行思维。
  • 有些开发需要另起线程,还要理解匿名内部类等知识,仔细看看是蛮有趣的。

当理解和掌握了Java GUI的开发以后,就好比一个“搭积木”、“拼拼图”的游戏过程(虽然这个过程伴随着诸多令人头秃的不好体验),慢慢的,就会渐至佳境。

VB.NET开发工具与JavaGUI开发的开发工具界面

先是看一下VB.NET开发工具——Visual Studio:

其实我们也都知道,VB.NET可以快速开发Windows环境下的GUI项目,VS的使用这里不加赘述,但看看它的开发方式,你可能就想:Java能不能也拖动生成然后再编码完善呢?
这里推荐Eclipse IDE + Window-Builder插件,开发视图如下 (字用鼠标写的,太丑了,见谅) :

左下角切换文本编辑器的视图和拖动窗体的视图,自己调节组件大小和进行布局管理,可以灵活添加事件监听器,从而大大简化了GUI的开发。
由于写过Window-Builder下的Swing代码,所以学VB.NET的时候心里耐受力还是可以的。

结语

虽然现在大家都在学习Web开发、移动开发而较少提及桌面程序开发,更何况Java本身就是“不适合”做GUI开发的语言,有很多人觉得学而无益,故而不愿学习这块儿的技术。
其实呢,我觉得但凡是一种技术都有它存在的意义,只不过你可能因为个人的精力和规划有所倾斜或者专攻。之前玩的Logisim还是Swing写的呢。尽管说没意思,可又有几个人能写到那个程度呢?
感兴趣的可以学一学,不感兴趣的就算了,但是我觉得UI开发的思想是贯通的。特别是Swing组件本身就采用了MVC模式,若能体会到其精髓,也算不虚此行了吧。
当然了,GUI毕竟不能当饭吃,只是请你想想:不会GUI,会不会有点遗憾呢?

【Java】浅谈Java的GUI开发相关推荐

  1. 单例设计模式java,浅谈Java编程中的单例设计模式

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

  2. java hexits,[Java]浅谈Java的异常体系

    为什么需要异常 理想的情况下,程序是不会有BUG的.但是现实的情况是:处处都可能引发BUG,比如一个糟糕的输入.需要访问的资源不存在.网络出现抖动.服务器资源不足等等.这就要求我们的程序需要一个机制来 ...

  3. 浅谈JAVA程序破解(原创)

    浅谈JAVA程序破解 作者:舵手 申明:如转载请保证文章的完整性以及出处 最近对JAVA程序的破解比较感兴趣,拿几个行业软件练了一下手,略有心得,拿出来与菜鸟分享!注意只是一点心得, 本文并不涉及具体 ...

  4. 浅谈JAVA程序破解

    浅谈JAVA程序破解 http://www.blogjava.net/galaxyp/archive/2006/04/19/41833.html 作者:舵手 申明:如转载请保证文章的完整性以及出处 最 ...

  5. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  6. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  7. java的throw_浅谈Java的throw与throws

    浅谈Java异常 以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚.今天用实例测试一下 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被 ...

  8. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  9. 猿来小课Java视频教程讲师浅谈JAVA体系结构

    猿来小课Java视频教程讲师:Java体系结构中不仅定义了Java的开发编译环境,也定义了Java的运行环境.为运行Java应用程序和applet,计算机上应安装JVM和Java运行时解释器,这两个部 ...

  10. Java可以用到军事方面吗_恭喜遥三运载火箭发射成功, 浅谈 java 在军事方面的运用!...

    恭喜遥三运载火箭发射成功, 浅谈 java 在军事方面的运用! 恭喜长征五号遥三成功发射! 来聊聊军事系统都是用什么语言编写的 长征五号运载火箭, 是中国运载火箭升级换代的重要工程, 作为中国首型大推 ...

最新文章

  1. 模拟linux磁盘满,linux 磁盘满了简单处理一下
  2. 高速缓冲DNS相关配置详情
  3. 【Android 逆向】IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )
  4. Go - interface
  5. 【整理】SAP PM工厂维护模块初识
  6. openshift_在WildFly和OpenShift上的WebSocket聊天
  7. mybatis中resultType取出数据顺序不一致解决方法
  8. Android 中的adapter和作用以及常见的adapter
  9. java程序效率_优化JAVA程序的执行效率和性能
  10. v​n​c​服​务​​安​装​与配置
  11. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day01~day10)
  12. WPF基础五:UI①布局元素StackPanel
  13. Photoshop插件-删除中间调通道蒙板-脚本开发-PS插件
  14. eCos configtool 在ubuntu 10.10以后菜单消失的解决
  15. 【中科三方】什么是云解析DNS?云解析DNS有必要购买吗?如何购买云解析DNS?
  16. 仿射变换(Affine Transformation)原理及应用(1)
  17. 数字图像处理(冈萨雷斯版)-第一章
  18. hdu 4598 Difference(奇圈判定+差分约束)
  19. LoadrRunner报错-Error: The table 'F:\测试脚本\loadrunner\toutTest3\NewParam.dat' does not exist.
  20. Stochastic Depth ResNet

热门文章

  1. 2.6 子窗口赋值给父窗口并关闭子窗口 我的程序猿之路:第十六章
  2. weak_ptr打破环状引用
  3. sudo: Cannot execute /usr/local/bin/zsh: No such file or directory 问题
  4. 当前,我们的DJANGO项目的requirements.txt文件
  5. Java--File文件操作
  6. 日期格式转换:String 与 date
  7. java使用itext将图片放到pdf模板的指定位置
  8. OpenResty+Lua+redis+mysql实现高性能高可用限流缓存
  9. vs未指定启动文件_高效开发利器之自定义模板文件
  10. img 错误样式css,css设置图片大小_css 控制img图片的大小样式