西南科技大学网络教育系列课程 高级语程序设计(Java) 第十章 基于Swing的图形用户界面设计
Peers是本地GUI组件,由AWT来操控,Peers对程序开发者是隐而不见的,各平台所产生的peers与各平台有关 。 AWT组件与SWING组件概述 Java在初期借助一种窗口开发类库,叫作AWT(Abstract Windows Toolkit,抽象窗口工具箱)来达到在图形接口上平台独立性。 Java程序 Java AWT 本地窗口系统 Peers 显示 AWT处理用户界面元素的方法 把用户界面元素的创建和行为委托给目标平台(Windows、Macintosh、Linux等)上的本地GUI工具(Peers,对等组件)进行处理。 Peers是本地GUI组件,由AWT来操控,Peers对程序开发者是隐而不见的,各平台所产生的peers与各平台有关 。
重量组件和轻量组件 与本地对等组件相关联的组件(AWT组件)就被称为重量组件。 不依赖本地对等组件的组件(Swing组件)就被称为轻量组件。 重量组件具有平台不一致性。 轻量组件在重量容器的窗口中绘制,背景可以是透明的。
AWT与Swing AWT 粗糙、不美观 平台不一致,“一次编写,到处调试” 运行效率较低,不适合复杂界面的程序 开发速度较快 Swing 更丰富、更方便的用户界面元素集合 对底层平台的依赖更少,和平台有关的bug也就更少 给不同平台上的用户一致的感觉 swing组件大部分是轻量组件,没有对等组件 Swing并没有完全代替AWT
Container JFrame JDialog Window Frame Dialog JComponent JButton JTextField JTeatArea JTree JPanel JTable Component JComponent类的部分子类以及JFrame类和JDialog类 javax.swing包中JComponent(轻组件)类是java.awt包中Container类的一个直接子类、Componenet类的一个间接子类。javax.swing包中的JFame类和JDialog类分别是java.awt包中Frame类和Dialog类的直接子类、Window类的间接子类。
两个基本概念 组件(component):Java把由Component类的子类或间接子类创建的对象称为一个组件,是图形用户界面中的可见部分,如按钮、标签。 容器(container): Java把由Container的子类或间接子类创建的对象称为一个容器,是图形用户界面中容纳其它组件的部分,如窗体。 一个容器中可容纳一个或多个组件,也可容纳其他容器。
认识几个方法 add( ):将组件添加到该容器中。 removeAll() :移掉容器中的全部组件。 remove(Component c) 移掉容器中参数指定的组件。 validate():每当容器添加新的组件或移掉组件时,调用该方法以保证容器中的组件能正确显示出来。
组件的三要素 外观显示,如组件的颜色、大小、可见性 行为,组建对外部刺激(事件)的反应 三要素之间的是相互关联的,如按钮组件 内容,如按钮的状态、文本框中的文本 外观显示,如组件的颜色、大小、可见性 行为,组建对外部刺激(事件)的反应 三要素之间的是相互关联的,如按钮组件 按钮状态 按钮外观 按钮观感 外部事件 按钮行为
Swing的结构 Swing采用MVC(模型 - 视图 - 控制)设计模式 MVC的基本思想就是将一个GUI组件分成三个部分: 模型部分 — 存储内容(完整的) 视图部分 — 显示内容(完整或不完整的) 控制部分 — 处理用户事件 模型必须实现改变和发现内容的方法 模型是完全不可见的,显示存储在模型中的数据是视图的工作,控制决定是否把外界的事件转化成对模型或视图的改变
例:用户在文本框中进行字符输入 例:用户在文本框中按下了光标键 按下字符键 控制器调用模型中的“插入字符”命令 改变文本框组件的内容 模型通知视图进行更新 视图改变了 例:用户在文本框中按下了光标键 按下光标键 控制器通知视图进行滚动 改变文本框组件的外观 对文本不会有任何影响 模型不会有改变
每个组件都有一个包装类(如JButton),用来保存模型和视图。 在javax.swing包中提供了超过250个类,而其中有接近50个组件类(以J打头)。 javax.swing包中有四个最重要的类 JApplet、JFrame、JDialog和JComponent。 JFrame、JApplet、JDialog都是重组件 swing包是属于Java基础类(Java Foundation Classes,JFC)的一部分。
JFrame窗体 JFrame的特性 JFrame类其子类创建的对象是窗体。 JFrame类或子类创建的对象是重量容器。 不可以把组件直接添加到JFame窗体中,应当把组件添加到内容面板中。 不能为JFame窗体设置布局,应为JFame窗体的内容面板设置布局。 JFame窗体通过调用getContentPane()方法得到它的内容面板。
JMnuBar ContentPane JFame窗体的基本结构
构造方法 常用方法 JFrame类常用方法: JFrame() :可以创建一个无标题的窗口。 JFrame(String s) :创建一个标题为s的窗口。 常用方法 public void setBounds(int a,int b,int width,int height) 窗口调用该方法可以设置出现在屏幕上时的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。
public void setSize(int width,int height):设置窗口的大小,窗口在屏幕出现是默认位置是(0,0)。 public void setVisible(boolean b):设置窗口是可见还是不可见,窗口默认是不可见的。 public void setResizable(boolean b):设置窗口是否可调整大小,窗口默认是可调整大小的。
其中的参数operation取下列有效值: public void setDefaultCloseOperation(int operation) :设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。 其中的参数operation取下列有效值: DO_NOTHING_ON_CLOSE:什么也不做。 HIDE_ON_CLOSE:隐藏当前窗口。 DISPOSE_ON_CLOSE:隐藏当前窗口,并释放窗体占有的其它资源。 EXIT_ON_CLOSE:结束窗体所在的应用程序。
菜单组件 JMenuBar 菜单条 Swing菜单由菜单条(JMenuBar)、菜单(JMenu)和菜单项(JMenuItem)构成。 菜单条是所有菜单和菜单项的根(容器)。 JMenuBar 菜单条 JMenuBar是JComponent类的子类,负责创建菜单条。 JMenuBar menuBar=new JMenuBar(); 将菜单条放置到JFrame窗口中: public void setJMenuBar(JMenuBar menubar); 需要注意的是,只能向窗口添加一个菜单条
JMenu 菜单 JMenu是JComponent类的间接子类,负责创建菜单。 pulbic JMenu():建立一个没有标题的菜单。 pulbic JMenu(String s):建立一个指定标题菜单,标题由参数s确定。 例如: 创建一个名为“Edit”的菜单,并添加到菜单条中。 JMenu editMenu=new JMenu(“Edit”); menuBar.add(editMenu);
常用方法 public void add(MenuItem item):向菜单增加由参数item指定的菜单选项对象。 public void add(String s):向菜单增加指定的选项。 public JMenuItem getItem(int n):得到指定索引处的菜单选项。 public int getItemCount():得到菜单选项数目。
JMenuItem 菜单项 JMenu是JComponent类的间接子类,负责创建菜单项。 public JMenuItem(String s):构造有标题的菜单项。 public JMenuItem(String text, Icon icon):构造有标题和图标的菜单项。 创建图标对象 Icon icon=new ImageIcon(“图标文件名”); 菜单项将被放在菜单里。例如: JMenuItem pasteItem=new JMenuItem(“Paste”); editMenu.add(pasteItem);
public void setEnabled(boolean b):设置当前菜单项是否可被选择 主要方法 public void setEnabled(boolean b):设置当前菜单项是否可被选择 public String getLabel():得到菜单选项的名字。 public void setAccelerator(KeyStroke keystroke): 为菜单项设置快捷键。 public static KeyStroke getKeyStroke(int keyCode, int modifiers) :返回KeyStroke对象。 keyCode取值范围: KeyEvent.VK_A~ KeyEvent.VK_Z modifiers取值:InputEvent.ALT_MASK InputEvent .CTRL_MASK InputEvent .SHIFT_MASK
嵌入JMenu子菜单 菜单项本身还可以是一个菜单,称这样的菜单项为子菜单。 JMenu editMenu = new JMenu(“Edit”); JMenu optionsMenu = new JMenu(“Options”); editMenu.add(optionsMenu);
布局设计 作用 有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。 优点 指定各个视图组件在窗口中的分布位置,实现动态布局。 有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。 优点 可重用性:基本界面可以被重用,组合成各种不同的复合式界面。 可扩展性:可以方便的扩展基本界面,从而创建更复杂的界面。 可维护性: 当复合式界面中的局部区域发生变化时,不会影响其它区域 。
布局管理让容器使用方法setLayout(布局对象)来设计自己的布局。 使用布局管理器来实现布局设计 布局管理器是基于AWT的 布局管理器的类型 流布局管理器:FlowLayout 边界布局管理器:BoderLayout 卡片式布局管理器:CardLayout 网格布局管理器:GridLayout 盒式布局管理器:BoxLayout 布局管理让容器使用方法setLayout(布局对象)来设计自己的布局。
容器的每个区域,只能加入一个组件,如果试图加入多个组件,其中只有一个组件是可见的。 BorderLayout Window型容器的默认布局,比如Jframe类、JDialog类。 每个被BorderLayout管理的容器均被划分为五个区域:东(EAST) ,南(SOUTH),西(WEST),北(NORTH),中(CENTER)。 容器的每个区域,只能加入一个组件,如果试图加入多个组件,其中只有一个组件是可见的。 对于东南西北这四个边界区域,如果,其中的某个区域没有用,它的大小将变为0,CENTER区域将扩展并占用该区域
构造方法 BorderLayout():构造一个间距为0的BorderLayout实例 BorderLayout(int hgap,int vgap):构造一个指定间距的BorderLayout实例 在BorderLayout布局管理器的管理下,组建必须通过add()方法加入到容器的五个命名区域之一,否则它们是不可见的。 方法:add(组件,区域)
import java.awt.*; import javax.swing.*; public class BorderL{ public static void main(String[ ] args){ JFrame f; JButton be,bw,bn,bs,bc; BorderL that=new BorderL(); f=new JFrame(“窗体"); be=new JButton(“东”); bs=new JButton(“南"); bw=new JButton(“西”); bn=new JButton(“北"); bc=new JButton(“中心"); f.getContentPane().add(be,"East"); f.getContentPane().add(bs,"South"); f.getContentPane().add(bw,"West"); f.getContentPane().add(bn,"North"); f.getContentPane().add(bc,"Center"); f.setSize(350,200); f.setVisible(true); } }
将组件按照加入的顺序逐个地放在容器中的一行上,一行放满后再另起一个新行。 每一行中的组件按布局指定的方式对齐方,默认情况下是居中对齐。 FlowLayout 将组件按照加入的顺序逐个地放在容器中的一行上,一行放满后再另起一个新行。 每一行中的组件按布局指定的方式对齐方,默认情况下是居中对齐。 三种构造方法: FlowLayout() FlowLayout(int align) FlowLayout(int align,int hgap,int vgap) FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER(默认) hgap:垂直间距,vgap:水平间距,默认值是5个像素
FlowLayout布局管理器不强行设定组件的大小,而是允许组件拥有自己希望的大小。 每个组件都有一个getPreferredSize()方法,容器布局管理器会调用此方法取得每个组件希望的大小。 FlowLayout布局是JPanle容器的默认布局管理器。
当容器中组件数增加时,就显得高低参差不齐,采用容器嵌套的方式,即把一个容器当作一个组件加入另一个容器,使这个容器的布局达到应用的需求
网格式的布局管理器,它将容器空间划分成若干行乘若干列的网格,每个格放一个组件。 各组件按照从上到下,从左至右的顺序排列。 构造方法: GridLayout 网格式的布局管理器,它将容器空间划分成若干行乘若干列的网格,每个格放一个组件。 各组件按照从上到下,从左至右的顺序排列。 构造方法: GridLayout():创建一个只有一行的网格,列数根据实际需要而定 GridLayout(int rows,int cols):创建指定行、列的网格,rows和cols中的一个值可以为0 GridLayout(int rows,int cols,int hgap,int vgap)
使用GridLayout布局设计的一般步骤: 使用GridLayout布局容器调用方发add将组件加入容器。 GridLayout布局中每个网格都是相同大小并且强制组件与网格相同大小
卡式布局管理器,可以容纳多个组件,但是同一时刻容器只能从这些组件中选出一个来显示,被显示的组件占据容器的整个空间。 CardLayout 卡式布局管理器,可以容纳多个组件,但是同一时刻容器只能从这些组件中选出一个来显示,被显示的组件占据容器的整个空间。 选项卡窗格(JTabbedPane)的默认布局是CardLayout。 在JTabbedPane中加入组件: add(String text,Component c); 指定和该组件c对应的选项卡的文本提示是text。
BoxLayout 用BoxLayout类可以创建盒式布局。 Box类创建的容器称作一个盒式容器,盒式容器的的默认布局是盒式布局,而且不允许更改盒式容器的布局。 行型盒式布局 容器中组件的上沿在同一水平线上。 Box类的类方法createHorizontalBox()可以获得一个具有行型盒式布局的盒式容器 行型盒式容器中组件间的间距:Box类调用静态方法createHorizontalStrut(int width)可以得到一个不可见的水平Struct类型对象,称做水平支撑。
列型盒式布局 容器中组件的左沿在同一垂直线上。 Box类的类方法createVerticalBox()可以获得一个具有列型盒式布局的盒式容器。 列型盒式容器中组件间的间距:Box类调用静态方法createVertialStrut(int height)可以得到一个不可见的垂直Struct类型对象,称做垂直支撑。
中间容器 JPanel 面板 用来添加组件的轻容器,称为中间容器。 JPanel类用来创建一个面板对象,可以向这个面板添加组件(直接使用add方法)。 使用时需要把这个面板添加到底层容器或其他中间容器中。 JPanel面板的默认布局是FlowLayout布局。 构造方法 JPanel():构造一个面板容器对象
把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。 JScrollPane滚动窗格 把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。 例如,JTextArea不自带滚动条,可把文本区放到一个滚动窗格中。 构造方法 JScrollPane(component c):构造一个滚动窗格。
JSplitPane拆分窗格 被分成两部分的容器,拆分窗格有两种类型: 水平拆分:用一条拆分线把容器分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动 垂直拆分:用一条拆分线分成上下两部分,上面放一个组件,下面放一个组件,拆分线可以垂直移动。 构造方法 JSplitPane(int a, Component b ,Component c): 构造一个拆分窗格 setDividerLocation(double position):拆分窗格设置拆分线的位置。
如果添加到容器中的组件经常需要处理重叠问题,就可以将组件添加到JLayeredPane容器。 add(Jcomponent com, int layer); 添加组件com,并指定com所在的层。 layer取值: DEFAULT_LAYER:最底层 PALETTE_LAYER MODAL_LAYER POPUP_LAYER DRAG_LAYER:最上面的层
public void setLayer(Component c,int layer):重新设置组件c所在的层 public int getLayer(Component c):获取组件c所在的层数。
文件组件 JTextField文本框 用来建立文本框的,用户可以在文本框输入单行的文本。 构造方法 JTextField(int x):创建文本框对象,可以在文本框中输入若干个字符,文本框的可见字符个数由参数x指定。 JTextField(String s) :创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。
主要方法 public void setText(String s):设置文本框中的文本为参数s指定的文本。 public String getText() :获取文本框中的文本。 public void setEditable(boolean b) :指定文本框的可编辑性(默认为可编辑的)。 public void setHorizontalAlignment(int alignment) :设文本在文本框中的对齐方式,其中alignment的有效值确定对齐方式,如:LEFT、CENTER、RIGHT。
JPasswordField 建立一个密码框对象 setEchoChar(char c):设置回显字符(默认的回显字符是‘*’)。 char[ ] getPassword()方法获取密码框中的密码。
ActionEvent事件 基于委托的事件模型 事件的处理由事件的来源(source,对象) ,委托给一个或多个事件监听者(Event Listener)来处理(事件监听者就可视为一种处理事件的对象)。 组件激发事件,事件监听器监听并处理这一特定事件。 委托的方法是调用组件的注册监听器方法addxxxListener(Event Listener)
事件监听者 是一种处理事件的接口,定义于java.awt.event包中,在此包中也定义了各种事件类 当事件来源对象因用户的操作(鼠标、键盘等),系统会自动触发此事件类对象E,并通知所委托的事件监听者A(需要预先注册),然后事件监听者A中所定义的处理各种事件的方法便会处理此事件E的各种状况 。
来源对象 向事件监听者A注册 事件监听者A 事件处理者2 事件处理者n 事件处理者1 用户操作 产生 事件E
通知 发生XXX事件 事件源.addXXXListener(存放监视器引用的接口) 接口方法(XXX e) 实现XXXListener接口的监视器 接口回调 事件处理示意图
事件结构 所有的事件动作都开始于java.util包中的EventObject类,以及EventListener接口,它们构成了委托事件模型的基础。 在java.awt.event包中定义了各类事件类、事件监听接口、以及事件转接器(Adapter)。
addActionListener(ActioListener listener); 对事件的处理:实现ActionListener接口 ActionEvent事件的处理 注册监听器 addActionListener(ActioListener listener); 对事件的处理:实现ActionListener接口 public void actionPerformed(ActionEvent e) class MyListener extends ActionListener{ ……. Mylistener listener = new Mylistener(); 组件对象.addActionListener(listener); ……. public void actionPerformed(ActionEvent e){ // 实现方法体 } }
以内部类方式实现 组件对象.addActionListener( new ActionListener(){ ……. public void actionPerformed(ActionEvent e){ // 实现方法体 }); …… public Object getSource():返回发生ActionEvent事件的对象的引用。
JTextArea 文本区 JTextArea类用来建立文本区,用户可以在文本区输入多行的文本。 构造方法 JTextArea(int rows, int columns):构造一个可见行和可见列分别是rows、columns的文本区。 常用方法 setLineWrap(boolean b):决定输入的文本能否在文本区的右边界自动换行。 setWrapStyleWord(boolean b):决定是以单词为界(b取true时)或以字符为界(b取false时)进行换行。
setText(String s) :设置文本内容。 append(String s):尾部加文本。 getText():获取文本区的文本。 setText(String s) :设置文本内容。 append(String s):尾部加文本。 insert(String s,int x):在文本区的指定位置处插入文本。 public void copy():拷贝选定的区域。 public void cut():剪切选定的区域。 public void paste():在指定的区域粘贴。 JTextComponent类的方法
按钮与标签组件 JButton 按钮组件 是用来建立按钮的。 构造方法: JButton(String text):创建名字是text的按钮。 public JButton(Icon icon):创建带有图标icon的按钮。 public JButton(String text, Icon icon):创建名字是text且带有图标icon的按钮 。
public String getText():获取当前按钮上的名字。 常用方法 public String getText():获取当前按钮上的名字。 public void setText(String text):重新设置当前按钮的名字,名字由参数text指定。 public Icon getIcon():获取当前按钮上的图标。 public void setIcon(Icon icon):重新设置当前按钮上的图标。 public void setHorizontalTextPosition(int textPosition):设置按钮名字相对按钮上图标的水平位置。 SwingConstants.RIGHT SwingConstants.LEFT SwingConstants.CENTER SwingConstants.LEADING SwingConstants.TRAILING
public void setVerticalTextPosition(int textPosition):设置按钮上名字相对按钮上图标的垂直位置。 public void addActionListener(ActionListener) 按钮对象调用该方法可以向按钮增加动作监视器。 public void removeActionListener(ActionListener) 按钮对象调用该方法可以移去按钮上的动作监视器。
JLabel类负责创建标签对象,标签用来显示信息,但没有编辑功能。 构造方法: public JLabel () public JLabel (String s ) public JLabel(String s, int aligment) public JLabel (Icon icon) public JLabel (String s,Icon icon,int aligment) SwingConstants.RIGHT SwingConstants.LEFT SwingConstants.CENTER SwingConstants.LEADING SwingConstants.TRAILING
常用方法 String getText() 获取标签的名字。 void setText(String s) 设置标签的名字。 Icon getIcon() 获取标签的图标。 void setIcon(Icon icon) 设置标签的图标。 void setHorizontalTextPosition(int a) 参数a确定名字相对于图标的位置;a的取值是: JLabel.LEFT,JLabel.RIGHT。 void setVerticalTextPosition(int a) 参数a确定名字相对于JLabel上的图标的位置;参数a取值是:JLabel.BOTTOM,JLabel.TOP。
复选框与单选按钮组件 JCheckBox复选框 复选框提供两种状态,一种是选中,另一种是未选中,用户通过单击该组件切换状态。 构造方法 public JCheckBox():创建一个没有名字的复选框。 public JCheckBox(String text):创建一个名字是text的复选框。 public JCheckBox(Icon icon):创建一个带有默认图标icon,但没有名字的复选框。 public JCheckBox(String text, Icon icon):创建一个带有默认图标和名字text的复选框。
常用方法 public void setIcon(Icon defaultIcon):设置复选框上的默认图标。 public void setSelectedIcon(Icon selectedIcon)设置复选框选中状态下的图标。 public boolean isSelected() 如果复选框处于选中状态该方法返回true,否则返回false。 如果不对复选框进行初始化设置,默认的初始化设置均为未选中。
addItemListener(ItemListener listener):发生ItemEvent事件的监视器的方法 public void itemStateChanged(ItemEvent e): 对发生的事件作出处理。 getItemSelectable():返回Itemevent事件的事件源。 class CheckBoxWindow extends JFrame implements ItemListener { …… box.addItemListener(this); public void itemStateChanged(ItemEvent e) {//对事件的处理} }
当创建了若干个单选按钮后,应使用ButtonGroup再创建一个对象,然后利用这个对象把这若干个单选按钮归组。 JRadioButton单选按钮 一组单选按钮同一时刻只能有一个被选中。 当创建了若干个单选按钮后,应使用ButtonGroup再创建一个对象,然后利用这个对象把这若干个单选按钮归组。 归到同一组的单选按钮每一时刻只能选一。 例如: ButtonGroup grounp=new ButtonGroup(); JRadioButton button1=new JRadioButton(“小学”); button2=new JRadioButton(“中学”); grounp.add(button1); grounp.add(button2);
列表组件 用户可以在下拉列表看到第一个选项和它旁边的箭头按钮。 当用户单击箭头按钮时,选项列表打开。 常用方法 public JComboBox() 创建一个没有选项下拉列表。 public void addItem(Object anObject) 增加选项。 public int getSelectedIndex() 返回当前下拉列表中被选中的选项的索引,索引的起始值是0。
public Object getSelectedItem() 返回当前下拉列表中被选中的选项。 public void removeItemAt(int anIndex) 从下拉列表的选项中删除索引值是anIndex 选项。 public void removeAllItems() 删除全部选项。 public void addItemListener(ItemListener) 向下拉列表增加ItemEvent事件的监视器。 下拉式列表上的ItemEvent事件 对于下拉式列表事件源,可以发生ItemEvent事件。
表格组件 使用JTable可以创建一个表格对象。 构造方法 JTable (Object[ ][ ] data , Object[ ] columnName) 表格的视图将以行和列的形式显示数组data每个单元中对象的字符串表示。 参数columnName用来指定表格的列名。 用户在表格单元中输入的数据都被认为是一个Object对象。 用户通过表格视图对表格单元中的数据进行编辑,以达到修改二维数组data中对应的数据。 Object[][] a = new Object[3][4]; Object[] name = {"商品名称","单价","销售量","销售额"}; JTable table=new JTable(a,name);
树组件 树与节点 JTree类的实例称作树组件。 构造树组件前要先创建出称作节点的对象。 实现MutableTreeNode接口的类创建的对象都可以成为树上的节点。 树中最基本的对象叫做节点,树以垂直方式显示数据,每行显示一个节点。 树中只有一个根节点,所有其它节点从这里引出。 节点包括根节点,带子节点的分支节点,不带子节点的叶节点。
DefaultMutableTreeNode类 构造方法: DefaultMutableTreeNode(Object userObject):创建的节点默认可以有子节点 DefaultMutableTreeNode(Object userObject,boolean allowChildren):创建的节点有无子节点要根据参数allowChildren的真假来判断,为true时有子节点,为假时无子节点。
树上的TreeSelectionEvent事件 常用方法: addTreeSelectionListener(TreeSelectionListener listener):获得一个TreeSelectionEvent事件的监视器 public void valueChanged (TreeSelection Event e):处理TreeSelectionEvent事件 getLastSelectedPathComponent() :获取选中的节点 getUserObject():得到与节点相关的信息。
进度条组件 JProgressBar类 使用JProgressBar类创建进度条组件。 该组件能用一种颜色动态地填充自己,以便显示某任务完成的百分比。 构造函数: JProgessBar() JProgressBar(int min,int max) JProgressBar(int orient ,int min,int max) 常用方法 pulic void set setValue(int n) 用一种颜色水平填充自己。 setMinimum(int min):改变最小值 setMaximum(int max):改变最大值。
ProgressMonitorInputStream是javax.swing包提供的输入流类。 读取文件时可看见文件的读取进度。 构造方法: 带进度条的输入流 ProgressMonitorInputStream是javax.swing包提供的输入流类。 读取文件时可看见文件的读取进度。 构造方法: ProgressMonitorInputStream(Conmponent c,String s,InputStream);
组件的常见方法 JComponent类是所有组件的父类。 组件都是矩形形状,组件本身有一个默认的坐标系,组件的左上角的坐标值是(0,0)。 如果一个组件的宽是20,高是10,那么,该坐标系中,x坐标的最大值是20;y坐标的最大值是10,如下图所示。 组件 组件上的坐标系
组件的颜色 public void setBackground(Color c) :设置组件的背景色。 public void setForeground(Color c): 设置组件的前景色。 public Color getBackground(Color c):获取组件的背景色。 public Color getForeground(Color c) :获取组件的前景色。 public Color(int red,int green,ing blue):创建一个颜色对象,其中red、green、blue的取值在0到255之间。
public void setOpaque(boolean isOpaque):设置组件是否不透明 组件透明 组件默认是不透明的。 public void setOpaque(boolean isOpaque):设置组件是否不透明 isOpaque取false时,组件被设置为透明。 isOpaque取true时组件被设置为不透明。 public boolean isOpaque(): 当组件不透明时该方法返回true,否则返回false。
组件的边框 组件默认的边框是一个黑边的矩形。 public void setBorder(Border border):设置组件的边框。 该方法的参数是一个接口,必须向该参数传递一个实现接口Border类的实例。 如果传递一个null,组件将取消边框。 public Border getBorder():返回边框。
组件的字体 public void setFont(Font f):组件调用该方法设置组件上的字体。 public Font getFont(Font f):组件调用该方法获取组件上的字体。 上述方法中用到了java.awt包中的Font类, Font类的构造方法是: public Font(String name,int style,int size) :创建字体对象。 name是字体的名字 style决定字体的样式,取值是一个整数。
组件的大小与位置 public void setSize(int width,int height) 设置组件的大小。 public void setLocation(int x,int y) 设置组件在容器中的位置,组件距容器的左、上边界 x、 y 个像素。 public Dimension getSize() 返回一个Dimension对象的引用,该对象实体中当前组件的宽度和高度。
public Point getLocation(int x,int y) 返回一个Point对象的引用,该对象实体中含有组件的左上角在容器的坐标系中的x坐标和y坐标。 public void setBounds(int x,int y,int width,int height)设置组件在容器中的位置和组件的大小。 public Rectangle getBounds() 返回一个Rectangle对象的引用,该对象实体中含有当前组件左上角在容器坐标系中的x坐标和y坐标,宽度和高度。
组件的激活与可见性 public void setEnabled(boolean b) 设置组件是否可被激活。 当参数b取值true时,组件可以被激活。 当参数b取值false 时,组件不可激活。 默认情况下,组件是可以被激活的。 public void setVisible(boolean b) 设置组件在该容器中的可见性 当b取值true时,组件在容器中可见。 当b取值false时,组件在容器中不可见。 除了Window型组件外,其它类型组件默认是可见的。
焦点事件 组件可以触发焦点事件。 public void addFocusListener(FocusListener listener) :注册焦点事件监听器。 如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件。 创建监视器的类必须要实现FocusListener 接口,该接口有两个方法: public void focusGained(FocusEvent e) public void focusLost(FocusEvent e) text.addFocusListener(this); public void focusGained(FocusEvent e) {//设置背景颜色为绿色} public void focusLost(FocusEvent e)
窗口事件 WindowListener接口 JFrame类是Window类的子类,Window型对象都能触发WindowEvent事件。 addWindowlistener():注册监听器 WindowListener接口中有7个不同的方法,分别是: public void windowActivated(WindowEvent e) 当窗口从非激活状态到激活时,窗口的监视器调用该方法。
public void windowDeiconified(WindowEvent e) :当窗口撤消图标化时调用该方法。 public void windowDeactivated(WindowEvent e): 当窗口激活状态到非激活状态时调用该方法。 public void windowClosing(WindowEvent e): 当窗口正在被关闭时调用该方法。 public void windowClosed(WindowEvent e) : 当窗口关闭时调用该方法。 public void windowIconified(WindowEvent e): 当窗口图标化时调用该方法。 public void windowDeiconified(WindowEvent e) :当窗口撤消图标化时调用该方法。 public void windowOpened(WindowEvent e): 当窗口打开时调用该方法。
鼠标事件 鼠标事件(MouseEvent) 用户的下列7种操作都可以使得组件触发鼠标事件: 鼠标指针从组件之外进入 鼠标指针从组件内退出 鼠标事件是鼠标的移动、点击、拖放等行为。 鼠标在组件上的操作(如点击按钮、菜单),不需要处理为鼠标事件,该组件会进行相应的处理。 用户的下列7种操作都可以使得组件触发鼠标事件: 鼠标指针从组件之外进入 鼠标指针从组件内退出 鼠标指针停留在组件上时,按下鼠标 鼠标指针停留在组件上时,释放鼠标 鼠标指针停留在组件上时,单击鼠标 在组件上拖动鼠标指针 在组件上运动鼠标指针
MouseListener接口与MouseMotionListener接口 MouseListener、MouseMotionListener都是处理MouseEvent的接口 MouseListener处理对象对于鼠标的进入、离开、下压、释放及敲击事件 使用addMouseMotionListener (MouseListener listener) 注册监听器 MouseListener接口中的5个方法 mousePressed(MouseEvent):负责处理鼠标按下触发的鼠标事件。
mouseReleased(MouseEvent e):负责处理鼠标释放触发的鼠标事件。 mouseEntered(MouseEvent e):负责处理鼠标进入组件触发的鼠标事件。 mouseExited(MouseEvent e):负责处理鼠标退出组件触发的鼠标事件。 mouseClicked(MouseEvent e):负责处理鼠标单击或连击触发的鼠标事件。
MouseMotionListener接口 addMouseMotionListener(MouseListener listener):注册监听器 接口中的两个方法 mouseDragged(MouseEvent e):负责处理鼠标拖动事件 mouseMoved(MouseEvent e):负责处理鼠标移动事件
getX():返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的x-坐标。 MouseEvent 类 MouseEvent类的重要方法 getX():返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的x-坐标。 getY():返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的y-坐标。 getClickCount():返回鼠标被连续单击的次数。 getModifiers() :返回一个整数值。 左键返回的值是常量BUTTON1_MASK。 右键返回的值是常量BUTTON3_MASK。 getSource():返回触发当前鼠标事件的事件源。
鼠标位置的坐标变换 程序可能需要知道鼠标指针在容器坐标系中的坐标,这就需要进行坐标变换。 public static Point convertPoint(Component source, int x, int y,Component destination):该方法返回一个Point对象。 根据鼠标指针在当前事件源source坐标系中的坐标(x,y),得到鼠标在容器 destination坐标系中的坐标。 该对象再调用getX()和getY()方法就可以获取鼠标在容器destination坐标系中的坐标。
鼠标事件的转移 假如正监视一个容器上的鼠标事件,而容器中添加了一些组件,则当在组件上鼠标操作时,容器将不知道这些操作的发生。 MouseEvent convertMouseEvent(Component source, MouseEvent sourceEvent, Component destination)使鼠标事件从一个事件源转移到另一个事件源上。 上述方法是javax.swing包中的SwingUtilities类的静态方法。
是SDK1.5在java.awt包中新增的一个类。 可以帮助程序获取鼠标指针在系统图形设备中的位置坐标。 获取鼠标在系统桌面上的坐标 PointerInfo类 是SDK1.5在java.awt包中新增的一个类。 可以帮助程序获取鼠标指针在系统图形设备中的位置坐标。 使用PointerInfo 的类方法: getPointerInfo():可以实例化一个PointerInfo对象。 PointerInfo pi=MouseInfo.getPointerInfo();
弹出式菜单由JPopupMenu类负责创建 创建弹出式菜单的构造方法 public JPopupMenu():构造无标题弹出式菜单。 public JPopupMenu(String label) 构造由参数label指定标题的弹出式菜单。 public void show(Component invoker, int x, int y):设置弹出式菜单在组件invoker上的弹出的位置。 JPopupMenu() =menu=new JPopupMenu(); menu.show(text,e.getX(),e.getY());
键盘事件 在具有键盘焦点的组件中按下或者释放按键时,将会激发键盘事件。 键盘事件由接口KeyListener的方法来处理 组件使用addKeyListener()注册监听器。 接口KeyListener中有3个方法: public void keyPressed(KeyEvent e):按下键盘上某个键时,方法keyPressed方法会自动执行。 public void keyTyped(KeyEvent e):当键被按下又释放时,keyTyped方法被调用 public void KeyReleased(KeyEvent e):当键被释放时,KeyReleased方法被调用。
public int getKeyCode():返回一个整形值,常用于在keyPressed方法中获取用户敲击的键的虚拟键代码。 java对字符和虚拟键代码进行了明确区分 虚拟键代码和键盘的扫描码类似,没有单独的小写虚拟键代码 虚拟键代码以VK_开头,是定义在KeyEvent类中的int型类变量,比如:VK_0,VK_A,VK_SHIFT,VK_RIGHT 在使用keyPressed和keyReleased方法时,需要进行虚拟键代码的检查,在使用keyTyped方法时需要进行字符进行检查
处理复合键 键盘事件KeyEvent对象调用 getModifiers()方法 可以返回下列的整数值,它们分别是InputEvent 类的类常量: ALT_MASK、CTRL_MASK 、SHIFT_MASK
对话框 JDialog类 JDialog类是Window的子类。 对话框必须要依赖于某个窗口或组件。 当它所依赖的窗口或组件消失,对话框也将消失。 当它所依赖的窗口或组件可见时,对话框又会自动恢复。 通过建立JDialog的子类来建立一个对话框类。 不可以把组件直接添加到对话框中。 不能为对话框设置布局 。 getContentPane():得到内容面板。
对话框的模式 对话框分为无模式和有模式两种。 如果一个对话框是有模式的对话框,那么当这个对话框处于激活状态时,只让程序响应对话框内部的事件,程序不能再激活它所依赖的窗口或组件,而且它将堵塞当前线程的执行,直到该对话框消失不可见。 无模式对话框处于激活状态时,程序仍能激活它所依赖的窗口或组件,它也不堵塞线程的执行。
消息对话框 消息对话框是有模式对话框 进行一个重要的操作动作之前,最好能弹出一个消息对话框。 可以用javax.swing包中的JOptionPane类的静态方法: public static void showMessageDialog (Component parentComponent,String message,String title, int messageType) 创建一个消息对话框。
确认对话框 确认对话框是有模式对话框。 可以用javax.swing包中的JOptionPane类的静态方法: public static int showConfirmDialog (Component parentComponent,Object message,String title,int optionType)创建一个确认对话框。 参数分别是对话框所依赖的组件、对话框上显示的消息,对话框的标题,对话框的外观。
颜色对话框 可以用javax.swing包中的JColorChooser类的静态方法: public static Color showDialog (Component component,String title,Color initialColor) 创建一个颜色对话框 参数component指定对话框所依赖的组件,title指定对话框的标题;initialColor指定对话框返回的初始颜色。
文件对话框 文件对话框提供从文件系统中进行文件选择的界面。 JFileChooser对象调用下列: showDialog(Component parent,String s) showOpenDialog(Component parent) showSaveDialog(Component parent) 以上方法都可以使得一个有模式对话框显示在桌面上 该对话框称作文件对话框。 文件对话框将在参数指定的组件parent的正前方显示,如果parent为null,则在系统桌面的正前方显示。
打印组件 Java 使用PrinterJob类实现打印功能。 使用该类提供的功能可以将程序中的整个窗口、窗口中的组件、组件中的文字等信息输出到打印机并打印出来。 布置打印任务的步骤 PrinterJob对象 要实现打印,首先要获取一个PrinterJob对象。 PrinterJob调用类方法: static PrinterJob getPrinterJob()返回一个和打印机相联系的PrinterJob对象。
设置打印格式及方式 在打印之前还需要打印格式和方式设置。 可以让PrinterJob对象调用方法: public abstract PageFormatpageDialog (PageFormat page) 弹出一个有模式的对话框。 为使用该方法,需要向该方法传递一个初始的PageFormat对象 public PageFormat defaultPage() 就可以得到一个具有默认打印方式的PageFormat对象。
设置打印任务 让PrinterJob对象调用void setPrintable (Printable painter,PageFormat format) 方法设置打印任务。 其中的format参数可以取值“页面设置”对话框返回的pageFormat。 painter参数必须是一个实现Printable接口的类创建的对象,这也是实现打印最关键的一步。 Printable接口有个静态常量: NO_SUCH_PAGE、PAGE_EXISTS Printable接口的一个方法: int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
实现Printable接口 该接口是程序实现具体打印任务的关键。 必须要保证被打印的组件com在设置的页面纸张上能够完整的打印出来,否则只能打印出组件的一部分。 取消打印 PrinterJob对象调用cancel() 方法可以终止PrinterJob对象正在进行的打印操作。
实际操作 在实际打印时,先进行页面设置等工作,然后开始布置打印操作。 PrinterJob提供的打印功能是基于“页模式”(page mode),比较适合打印带图标的组件。 文本区调用下列方法可返回文本区中总文本行数:public int getLineCount()
发布应用程序 可以使用jar.exe把一些文件压缩成一个JAR文件,来发布应用程序。 可以把Java应用程序中涉及到的类压缩成一个JAR文件,比如Tom.jar,然后使用Java解释器(使用参数-jar)执行这个压缩文件: java -jar Tom.jar 用鼠标双击该文件,执行这个压缩文件。
首先用文本编辑器(比如Windows中的记事本)编写一个清单文件(如:moon.mf)。 生成一个Jar文件的步骤如下: 首先用文本编辑器(比如Windows中的记事本)编写一个清单文件(如:moon.mf)。 Manifest-Version: 1.0 Main-Class: Example Created-By: 1.4 编写清单文件时,在“Manifest-Version:”和“1.0”之间、“Main-Class:”和主类“Example”之间,以及“Created-By:”和“1.4”之间必须有且只有一个空格。保存moon.mf到D:\test。
其中参数c表示要生成一个新的JAR文件;f表示要生成的JAR文件的名字;m表示文件清单文件的名字。 D:\test〉jar cfm Tom.jar moon.mf Example.class A.class B.class 其中参数c表示要生成一个新的JAR文件;f表示要生成的JAR文件的名字;m表示文件清单文件的名字。 现在就可以将Tom.jar文件拷贝到任何一个安装了Java运行环境的计算机上,只要用鼠标双击该文件就可以运行该Java应用程序了。 D:\test〉jar cfm Tom.jar moon.mf .