热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GUI(图形用户界面)

AWT概述GUI全称是GraphicalUserInterface,即图形用户界面,即应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其它各种图形界面元素GUI设计

AWT概述

  GUI全称是Graphical User Interface,即图形用户界面,即应用程序提供给用户操作的图形界面,包括窗口、菜单、按钮、工具栏和其它各种图形界面元素

  GUI设计提供了丰富的类库,这些类分别位于java.awt和javax.swing包中,简称为AWT和Swing
  Swing不仅实现了AWT中的所有功能,而且提供了更加丰富的组件和功能,足以满足GUI设计的一切需求。

AWT事件处理
事件处理机制
  事件处理机制专门用于响应用户的操作,比如,想要响应用户的点击鼠标、按下键盘等操作,就需要使用AWT的事件处理机制

常用事件分类
窗体事件
  WindowEvent用于表示这些窗体事件,在应用程序中,当对窗体事件进行处理时,首先需要定义一个类实现WindowListener接口作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器绑定

鼠标事件
  MouseEvent类用于表示鼠标事件,几乎所有的组件都可以产生鼠标事件,鼠标事件包括鼠标按下、鼠标松开、鼠标单击等。
对鼠标事件的处理可通过实现MouseListener接口或者继承适配器MouseAdapter类,然后调用addMouseListener()方法将监听器绑定到事件源对象

键盘事件
  键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件
KeyEvent类表示键盘事件,处理KeyEvent事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类。

动作事件
  在Java中,动作事件用ActionEvent类表示,处理ActionEvent事件的监听器对象需要实现ActionListener接口,但监听器对象在监听动作时,不会像鼠标事件一样处理鼠标个别的移动和单击的细节,而是去处理“按钮按下”这样“有意义”的事件。

布局管理器
FlowLayout流式布局管理器
  使用FlowLayout布局管理器时,容器会将组件按照添加顺序从左向右放置。当到达容器的边界时,会自动将组件放到下一行的开始位置。这些组件可以左对齐、居中对齐(默认方式)或右对齐的方式排列

BorderLayout边界布局管理器
  是一种较为复杂的布局方式,它将容器划分为五个区域,分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。组件可以被放置在这五个区域的中任意一个。

GridLayout网格布局管理器
  使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。

GridBagLayout网格包布局管理器
  与GridLayout布局管理器类似,不同的是,它允许网格中的组件大小各不相同,而且允许一个组件跨越一个或者多个网格。

CardLayout卡式布局管理器
  将界面看做一系列卡片,在任何时候只有其中一张卡片是可见的,这张卡片占据容器的整个区域。

BoxLayout盒子布局管理器

不使用布局管理器
  如果不希望通过布局管理器对容器进行布局,可以调用容器的setLayout(null)方法,将布局管理器取消。
不使用布局管理器时,程序必须调用容器中每个组件的setSize()和setLocation()方法或者是setBounds()方法(这个方法接收四个参数,分别是左上角的x、y坐标和组件的长、宽)来为这些组件在容器中定位

Swing


编程理念

MVC模式
  模型M(数据)和视图V(显示)分离,通过控制器C将二者松散耦合在一起
  观察者模式
  迪米特法则

监听器(接口回调)
  匿名内部类(就地实例化接口对象)
  窗口类实现监听器接口并重写回调方法
  内部类实现监听器接口并重写回调方法
  创建内部类对象作为一个或多个控件的监听器
  内部类可以访问外部类的私有成员(控件)

缺省适配器
  MouseListener / MouseMotionListener / MouseWheelListener
  MouseAdapter

  KeyListener
  KeyAdapter

  WindowListener
  WindowAdapter

窗口
JFrame
  JFrame和Frame一样是一个独立存在的顶级窗口,不能放置在其它容器之中,JFrame支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等等

JDialog
  JDialog是Swing的另外一个顶级窗口,它和Dialog一样都表示对话框
  JDialog对话框可分为两种:模态对话框和非模态对话框。
非模态对话框
  允许用户在处理对话框的同时与其它窗口交互
模态对话框
  指用户需要等到处理完对话框后才能继续与其它窗口交互

JInternalFrame多文档窗口(子窗口)
JWindow无边框的窗口

中间容器

JPanel
  和AWT中的Panel组件使方法基本一致,它是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。当然也可以使用构造函数JPanel(LayoutManager layout)或者它的setLayout()方法为其制定布局管理器。

JScrollPane带滚动条
  带有滚动条的面板容器,而且这个面板只能添加一个组件,如果想往JScrollPane面板中添加多个组件,应该先将组件添加到JPanel中,然后将JPanel添加到JScrollPane中

JSplitPane带分割条
  JTabbedPane带页签(选项卡)
  JDesktopPane可以放子窗口

文本组件
  用于接收用户输入的信息或向用户展示信息,其中包括文本框(JTextField)、文本域(JTextArea)等,它们都有一个共同父类      JTextComponent,JTextComponent是一个抽象类,它提供了文本组件常用的方法

  JTextComponent 类有两个子类,分别是JTextField和JTextArea
  JTextField:称为文本框,它只能接收单行文本的输入
  JTextArea:JTextArea称为文本域,它能接收多行的文本的输入

按钮组件
  常见的按钮组件有JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton类的直接或间接子类

JCheckBox组件被称为复选框,它有选中(是)/未选中(非)两种状态,如果用户想接收的输入只有“是”和“非”,则可以通过复选框来切换状态。如果复选框有多个,则用户可以选中其中一个或者多个。

JRadioButton组件被称为单选按钮,与JCheckBox复选框不同的是,单选按钮只能选中一个,就像收音机上的电台选择按钮,当按下一个,先前按下的按钮就会自动弹起,对于JRadioButton按钮来说,当一个按钮被选中时,先前被选中的按钮就会自动取消选中。

JComboBox
  被称为组合框或者下拉列表框,它将所有选项折叠收藏在一起,默认显示的是第一个添加的选项。当用户点击组合框时,会出现下拉式的选择列表,用户可以从中选择其中一项并显示。

菜单组件
  菜单组件分为下拉式菜单和弹出式菜单
下拉式菜单包括JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)

  JMenuBar:表示一个水平的菜单栏,它用来管理菜单,不参与同用户的交互式操作。
  JMenu:表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。
  JMenuItem:JMenuItem表示一个菜单项,它是菜单系统中最基本的组件。和JMenu菜单一样,在创建JMenuItem菜单项时,通常会使用  JMenumItem(String text)这个构造方法为菜单项指定文本内容

创建下拉式菜单的步骤如下所示:
1、创建一个JMenuBar菜单栏对象,将其放置在JFrame窗口的顶部
2、创建JMenu菜单对象,将其添加到JMenuBar菜单栏中
3、创建JMenuItem菜单项,将其添加到JMenu菜单中

在Java的Swing组件中,弹出式菜单用JPopupMenu表示
JPopupMenu弹出式菜单和下拉式菜单一样都通过调用add()方法添加JMenuItem菜单项,但它默认是不可见的,如果想要显示出来,则必须调用它的show(Component invoker,int x,int y)方法

常用控件

 基本控件
  JLabel标签
  Icon
  Font
  JButton按钮
  JTextField文本框
  JPasswordField密码框
  JRadioButton单选按钮ButtonGroup
  JCheckBox复选框
  JCombBox下拉列表ListCellRender
  JList列表ListCellRender
  JTextArea文本域
  JOptionPane弹出式模态对话框
  JFileChooser文件选择器
  JColorChooser颜色选择器
 高级控件
  JMenu菜单JMenuItem菜单项
  JPopupMenu上下文菜单(右键菜单)JMenuItem菜单项
  JToolBar工具栏
  JEditorPane编辑面板
  JProgressBar进度条
  JSlider滑动条
  JSpinner微调器
  JTable表格TableCellRender
  JTree树TreeCellRender

AWT绘图
  update(Graphics g)
  repaint()
  paint(Graphics g)

Swing绘图
  paintComponent(Graphics g)
  paintBorder(Graphics g)
  paintChildren(Graphics g)


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • Editedbymythouhttp:www.cnblogs.commythoupublicbooleancreateReflectedForAdapter(){finalintr ... [详细]
author-avatar
一直都在囚禁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有