GUI—— 图形化用户界面
JFC(Java Foundation Classed)是开发GUI的API集
JFC包括:AWT(Abstract Window Toolkit抽象窗口工具包)、Swing组件(建立在AWT上功能更强大的图形组件包)、JAVA 2D(实现高质量二维图形)
一.AWT框架
AWT的核心类是Component类。
Component类由基本组件和容器(Container)组件组成。
容器组件主要分为两部分:Window容器和Panel(面板)容器。
*Frame:Window容器的子类,带有标题和缩放角的窗口。
Frame容器被创建后是不可见的,所以我们需要人为设置可见性。
常用方法:
显示窗体方法 void setVisible(boolean b)(在Component类中)
设置背景色 setBackground(Color C)
设置尺寸 setSize(int a , int b)(a为长,b为宽,单位为像素)
限制位置和尺寸 setBound(int x,int y,int a,int b)(x,y为窗体横纵坐标)
Panel容器只能存在于其它的容器中,不能单独显示。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其它面板。
面板的默认布局管理器是FlowLayout布局管理器。
若需要要去掉panel指令的默认管理器,可初始化panel后调用方法panel.setLayout(null).
容器可以容纳容器和组件,故可以制作出复杂的布局。
二.布局管理器
布局管理器:决定组件的位置和大小。
五种布局管理器:
FlowLayout(流式布局管理器)
BorderLayout(边界布局管理器)
调用方法:
GridLayout(网格布局管理器)
CardLayout(卡片布局管理器)
它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到 CardLayout对象的组件为可见组件。
GridBagLayout(网格包布局管理器)
每个Container都有默认的布局管理器,但是我们可以通过设置空布局管理器(setLayout(null))来控制组件的大小和位置。
设置空布局管理器后,必须对所有组件调用setLocation(),setSize()或setBound()进行一个重定位。
二.AWT事件处理
AWT事件处理主要针对下述三类对象:
Event(事件):用户对组件的一个操作
Event Source(事件源):事件发生的场所,如Button1
Event Monitor(事件监听器):监听事件是否被处理。
(引自海同网校)
(一)AWT事件
AWT相关事件继承于java.awt.AWTEvent类。
这些事件分为两大类:低级事件和高级事件。
1.低级事件:基于组件的事件,如:
ComponentEvent 组建事件:组件尺寸与位置变化
ContainerEvent 容器事件:组件增加、移动
WindowEvent 窗口事件:关闭窗口、窗口闭合、图标化
FocusEvent 焦点事件:焦点的获得和丢失
KeyEvent 键盘事件
MouseEvent 鼠标事件
2.高级事件:基于语义的事件,如:
ActionEvent 动作事件:当特定于组件的动作(比如被按下)发生时,由组件(比如Button)生成此高级别事件。事件被传递给每一个ActionListener 对象,这些对象是使用组件的addActionListener 方法注册的,用以接收这类事件。
AdjustmentEvent 调节事件:滚动条的滑动影响数目的改变等
ItemEvent 项目事件:选定或取消选定语义事件
TextEvent 文本事件:对文本对象的改变
(二)事件监听器
事件监听器通常是指一个类,通过该类必须实现与该事件类型相对应的接口。
注:事件监听器接口类名称与事件名称相对应。如:MouseEvent—— MouseListener
(三)事件适配器类
某些事件监听接口有对应的事件适配器类。通过事件适配器类,我们可以更简单地实现事件监听,从而缩短程序代码。
java.awt.event包中定义的事件适配器类包括以下七个:
MouseAdapter(鼠标适配器)、MouseMotionAdapter(鼠标运动适配器)、KeyAdapter(键盘适配器)、WindowAdapter(窗口适配器)、ComponentAdapter(组件适配器)、ContainerAdapter(容器适配器)、FocusAdapter(焦点适配器)
(四)观察者模式
定义对象间的一对多依赖关系,当一方的对象改变状态时所有的依赖着都会得到通知并自动更新。
观察者模式中任意数目的观察者不必知道彼此的存在。这种状态使代码具有较好的可重用性。
1. Subject(主题)
提供注册和注销观察者的接口
2. Observer(观察者)
为需要在主题变化时获得通知的对象定义一个更新接口。
3. ConcreteSubject(具体主题)
主题接口的一个实现类
4. ConcreteObserver(具体观察者)
观察者接口的实现类
三.Swing
Swing:用于开发Java应用程序用户界面的开发工具包
Swing控件可跨平台运行。
独立于本地平台的Swing控件称为轻量级控件,依赖于本地平台的AWT控件称为重量级控件。
工具包中所有的包都是以swing作为名称的,如:
javax.swing,javax.swing.event
swing组件的层次框架图:
(图片源自海通网校)
创建图形界面的主要步骤:
1.导入Swing包
2.设置顶层容器
3.设置按钮和标签等Swing组件
4.将组件添加至容器中
5.处理事件
例:
(图片源自海同网校)
具体操作方法参照记事本实例。
代码如下:
packagecom.iotek.swing;importjava.awt.BorderLayout;importjava.awt.Container;importjava.awt.Dimension;importjava.awt.FileDialog;importjava.awt.Frame;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;/** * Created by asus on 2017/2/15. *记事本实例 */public classNotePadDemo{ public static void main(String[] args){ newMyFrame("记事本"); }}classMyFrameextendsJFrame{ PRivateJTextAreatv_area=null; privateJScrollPanes_pane=null;//带滚动条的面板 privateJMenuBarmb=null;//菜单栏 privateJMenum_file=null;//文件菜单 privateJMenum_help=null;//帮助菜单 privateJMenuItemf_item_new=null;//文件菜单的菜单项(子菜单):新建 privateJMenuItemf_item_open=null;//文件菜单的菜单项(子菜单):打开 privateJMenuItemf_item_exit=null;//文件菜单的菜单项(子菜单):退出 privateJMenuItemf_item_about=null;//文件菜单的菜单项(子菜单):关于 publicMyFrame(Stringtitle) { super(title); init(); registerListener(); } //初始化相关的组件 private void init() { tv_area=newJTextArea(); s_pane=newJScrollPane(tv_area); //在需要时出现水平滚动条 s_pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); Containercpane=this.getContentPane(); cpane.add(s_pane,BorderLayout.CENTER); this.setSize(500,500);//设置窗体大小 //初始化菜单 mb=newJMenuBar();//新建菜单 m_file=newJMenu("文件");//新建文件菜单和其菜单项 f_item_new=newJMenuItem("新建"); f_item_open=newJMenuItem("打开"); f_item_exit=newJMenuItem("退出"); m_file.add(f_item_new); m_file.add(f_item_open); m_file.add(f_item_exit); m_help=newJMenu("帮助");//新建帮助菜单和其菜单项 f_item_about=newJMenuItem("关于"); m_help.add(f_item_about); mb.add(m_file);//将文件菜单与帮助菜单添加到菜单栏上 mb.add(m_help); //把菜单栏添加到窗体中 this.setJMenuBar(mb); this.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口的时候退出应用程序 //设置窗口在屏幕当中居中显示 //定义一个工具包 Toolkittoolkit=Toolkit.getDefaultToolkit(); DimensionscreenSize=toolkit.getScreenSize();//获得屏幕尺寸信息 intscreenWidth=screenSize.width;//获得当前屏幕宽度 intscreenHeight=screenSize.height;//获得当前屏幕度 intwindowWidth=this.getWidth();//获得当前窗体宽度 intwindowHeight=this.getHeight();//获得当前窗体高度 this.setLocation((screenWidth-windowWidth)/2, (screenHeight-windowHeight)/2);//使屏幕居中 this.setVisible(true);//显示窗体 } //给相关组件设置事件监听器 private void registerListener() { f_item_new.addActionListener(e -> newFile()); f_item_open.addActionListener(e->openFile()); f_item_exit.addActionListener(e->exitFile()); f_item_about.addActionListener(e->aboutFile()); } private void newFile() { if(!tv_area.getText().equals("")) { intres=JOptionPane.showConfirmDialog(null,"是否保存?",this.getTitle(),JOptionPane.YES_NO_CANCEL_OPTION); if(res==JOptionPane.YES_OPTION) { //弹出文件保存对话框 FileDialogfd=newFileDialog(this,"保存文件",FileDialog.SAVE); fd.setVisible(true); }else{ tv_area.setText("");//清空记事本中内容 } } } //打开记事本格式文件 private void openFile(){ FileDialogof=newFileDialog(this,"打开文件",FileDialog.LOAD); of.setVisible(true); } //退出 private void exitFile(){ if(!tv_area.getText().equals("")) { intres=JOptionPane.showConfirmDialog(null,"是否保存?",this.getTitle(),JOptionPane.YES_NO_CANCEL_OPTION); if(res==JOptionPane.YES_OPTION) { //弹出文件保存对话框 FileDialogfd=newFileDialog(this,"保存文件",FileDialog.SAVE); fd.setVisible(true); }else{ tv_area.setText("");//清空记事本中内容 } } //退出程序 System.exit(0); } //关于 private void aboutFile(){ AboutDialogaboutDialog=newAboutDialog(this,"about",true); }}
新闻热点
疑难解答