作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

GUI(Graphical User Interface)提供了图形化的界面,允许用户以图形的方式与系统进行互动。在GUI推广之前,用户通常要以文本命令的方式来控制计算机。GUI直观的将计算机的功能呈现给用户,降低了用户使用计算机的门槛。苹果和微软是GUI方面的先驱(虽然他们都一定程度上抄袭了Xerox),GUI也为这两位PC王者带来了丰厚的市场回报。

早期Mac GUI

GUI需要操作系统和硬件的支持。因此,GUI编程往往要处理移植性的问题。Java的GUI编程有相对比较好的可移植性。然而,随着GUI的重心向移动端转移,Java的GUI部分地位有些尴尬。无论如何,我们还是可以通过Java来了解GUI编程的一些基本内容。

图形的理解

看下面一个图片:

KTurtle绘制。参看把你的孩子打造成为码农

可以看到,图中有一个房子,房子上有窗户和门,窗户上有条纹,门上有把手,此外图像外还有一只小乌龟。我们所提到的房子,窗户,门,条纹,把手,都可以称其为对象。不同的对象之间有组合(composition)关系,比如 窗户和门属于房子,而把手属于门。乌龟和房子是相互独立的两个对象。此外,整个图像外有一个方框,用来表明可绘图的范围,所有上面提到的元素都依附于该方框。

另一方面,上述的对象有许多重复使用的图形元素(component)。比如把手是一个圆,房子和门由直线构成。相同的图形元素可以归为一类(class)。我们可以重复使用直线类来生成(不同性质的)直线,并组合到不同的对象中。

这是用面向对象的方式来理解一个图形。对象是描述图形的自然方式。面向对象编程在计算机图形方面应用非常成功。

一个简单的GUI

Java的GUI功能主要集中在awt和swing两个包中。awt是GUI底层包。swing包是高层的封装,更容易移植。这里将更侧重于swing包。

import javax.swing.*;

import java.awt.*;

public class HelloWorldSwing {

private static void createAndShowGUI() {

JFrame frame = new JFrame("HelloWorld");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Pane‘s layout

Container cp = frame.getContentPane();

cp.setLayout(new FlowLayout());

// create button

JButton b1 = new JButton("click me");

JButton b2 = new JButton("shit");

// add buttons

cp.add(b1);

cp.add(b2);

// show the window

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args) {

Runnable tr = new Runnable() {

public void run() {

createAndShowGUI();

}

};

javax.swing.SwingUtilities.invokeLater(tr);

}

}

上面程序中的main()方法中,我们使用匿名类(anonymous class)定义线程Runnable tr。匿名类是Java的一种嵌套类,它是在使用new创建对象时,使用一个{}来直接包含类的定义。在匿名类定义中,我们不需要说明类名。new后面跟随 接口() 或者 类(),匿名类的定义将实施该接口或继承该类。

运行结果如下:

图形树

我们利用add()方法,将一个图形元素加入到另一个元素中。通过这样的组合,所有的图形元素构成一个树状数据结构,这棵树表示了图像元素之间的隶属关系(containment hierarchy)。一个图形树就代表了一个GUI图形界面。

图形树

在程序中,我们首先创建了JFrame对象。JFrame是top-level container,也就是图形树的根。JFrame默认包含有Content Pane。Content Pane是一个Container对象,它一般包含有图形(除菜单MenuBar外)的所有可见元素。Content Pane中包含有两个按钮,即JButton元素。

Content Pane的setLayout()方法决定了元素的布局(layout)方式。布局决定了元素的位置。最直接的布局是直接说明元素的坐标位置(像素)。但GUI的设备尺寸可能差别很大,硬性规定像素位置将大大减小程序的可移植性。Swing提供了更高层的一些布局方法,比如FlowLayout下,元素将从左向右排列,在排满之后进入下一行。

图形元素

除了按钮之外,我们还可以在GUI中增加更多的元素,这些元素大都是JComponent的衍生类。比如:

import javax.swing.*;

import java.awt.*;

public class HelloWorldSwing {

private static void createAndShowGUI() {

JFrame frame = new JFrame("HelloWorld");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Pane‘s layout

Container cp = frame.getContentPane();

cp.setLayout(new GridLayout(0,2));

// JButton

JButton button = new JButton("click me");

JLabel label = new JLabel("OK");

// JPanel

JPanel panel1 = new JPanel(new BorderLayout());

JPanel panel2 = new JPanel(new BorderLayout());

panel2.setBackground(Color.red);

panel1.add(button, BorderLayout.CENTER);

cp.add(panel1);

panel2.add(label, BorderLayout.EAST);

cp.add(panel2);

// JList

String[] lines = {"a", "b", "c"};

JList list = new JList(lines);

cp.add(list);

// JCheckBox

cp.add(new JCheckBox());

// show the window

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args) {

Runnable tr = new Runnable() {

public void run() {

createAndShowGUI();

}

};

javax.swing.SwingUtilities.invokeLater(tr);

}

}

这里使用了GridLayout,效果如下:

JComponent

总结

这里只是简单的展示了GUI编程的一些例子,以便从概念上了解GUI编程。随着使用的深入,我们很可能转入IDE设计GUI,并自动生成GUI代码。无论如何,概念的理解都是必不可少的。

GUI的知识有助于学习移动端开发。

原文:http://www.cnblogs.com/zxqstrong/p/4918591.html

vamei java_java Vamei快速教程20 GUI相关推荐

  1. [转] Java快速教程

    [转] Java快速教程 转自:Vamei的Java快速教程 2015-07-03 安装环境 Step 1: Eclipse JDK 下载.安装.配置 (download.install.deploy ...

  2. Java快速教程--vamei 学习笔记(基础篇)

    链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:ht ...

  3. Python快速教程 尾声

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...

  4. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    转载自:https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程:给深度学习入门者的Python快速教程 - 基础篇 给深度学习入门者的Python快速教程 - ...

  5. 【Python教程】Python快速教程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容 ...

  6. 八十九、Python的GUI系列 | 使用PyQt5 快速构建一个GUI 应用

    @Author:Runsen @Date:2020/7/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  7. mysql c语言教程,C语言调用mysql快速教程(精华篇).pdf

    C语言调用mysql快速教程(精华篇).pdf ,使用 语言操作 之前,先在 里头创建一个数据库,一个表,在表里头添加 1 c mysql mysql 数据如下: 创建数据库,库名为 cusemysq ...

  8. AFNnetworking快速教程,官方入门教程译

    AFNnetworking快速教程,官方入门教程译 分类: IOS2013-12-15 20:29 12489人阅读 评论(5) 收藏 举报 afnetworkingjsonios入门教程快速教程 A ...

  9. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    转载自:https://zhuanlan.zhihu.com/p/24309547 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_f ...

最新文章

  1. 2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明
  2. SpringBoot学习之启动方式
  3. 播放器03:以文件夹的形式添加整个文件夹里面的文件到播放列表,播放刚加进来的第一首歌曲,默认顺序播放...
  4. java恶作剧小程序_一个Java恶搞小程序
  5. STM32 RTC实时时钟
  6. HystrixDashbord
  7. 2440启动代码分析
  8. sql 百分数_SQL经典50题笔记
  9. mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?
  10. pixel 6 root
  11. linux里netstat与ps,理解proc目录与linux进程、ps命令、netstat命令的关系
  12. 0基础学java可行吗_上海0基础学JAVA可行吗?
  13. 风行视频app v3.4.3.1
  14. COVID-19 AI-related Technical Paper
  15. R语言使用cor函数计算dataframe中多个数值数据列之间的相关性系数、计算spearman非参数的等级相关性系数
  16. scrollTop记录滚动位置
  17. win7 64位搭建scrapy
  18. iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store
  19. android隐藏app应用程序,Android开发:怎样隐藏自己的app应用
  20. xampp mysql远程连接_远程访问xampp

热门文章

  1. SQL搜索转为XML搜索
  2. CTF-RSA解密脚本
  3. React Native 实现FlatList的下拉刷新上拉加载
  4. 原生JS实现Ajax和JSONP跨域请求
  5. element ui 前台模板_SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(二):引入 element-ui 定义基本页面显示...
  6. 谈谈利用JavaScript结合相对单位rem实现自适应布局的简单而实用的方法
  7. angular-cli更新(link方式安装)
  8. source 导入大批量sql文件的方法
  9. go micro 学习笔记 2:环境搭建(可运行示例)
  10. 如何通过js处理相同时间的信息整合到一起的问题