33
swing 基基

swing 基础一

  • Upload
    yuma

  • View
    217

  • Download
    0

Embed Size (px)

DESCRIPTION

swing 基础一. 本节目标. 认识 swing swing 组件和容器 swing 布局管理 常用组件. swing 简介. 我们已经学过 java.awt 包 , 这些类创建的对象称为组件 , 当我们用这些类创建一个组件时 , 都有一个相应的本地组件在为它工作 ( 称为同位体 ),AWT 组件的设计原理是把与显示组件有关的许多工作和处理组件事件的工作交给相应的本地组件 . 因此我们把有同位的组件称为重量组件 , 基于重量组件的 GUI 设计有很多不足之处 ; 如 :a. 显示与平台有关 ,b. 不灵活 ( 不能图片添加到按钮上 ) 。 - PowerPoint PPT Presentation

Citation preview

Page 1: swing  基础一

swing 基础一

Page 2: swing  基础一

本节目标

认识 swing

swing 组件和容器

swing 布局管理

常用组件

Page 3: swing  基础一

swing 简介 我们已经学过 java.awt 包 , 这些类创建的对象称为组件 , 当我们用这些类创建一个组件时 , 都有一个相应的本地组件在为它工作( 称为同位体 ),AWT 组件的设计原理是把与显示组件有关的许多工作和处理组件事件的工作交给相应的本地组件 . 因此我们把有同位的组件称为重量组件 , 基于重量组件的 GUI 设计有很多不足之处 ;如 :a. 显示与平台有关 ,b. 不灵活 ( 不能图片添加到按钮上 ) 。

swing 是由 100% 纯 Java 实现的, swing 组件是用 java 实现的轻量级( light- weight )组件,没有本地代码,不依赖操作系统的支持,这是它与 AWT 组件的最大区 别。由于 AWT 组件通过与具体平台相关的对等类( Peer )实现,因此 Swing 比 AWT 组 件具有更强的实用性。 swing 在不同的平台上表现一致,并且有能力提供本地窗 口系统 不支持的其它特性 , 因为轻组件把与显示有关的许多工 作和处理组件的工作交给相应的 UI 代表来完成 . 。

Page 4: swing  基础一

swing 特性从 AWT 继承100% 的纯 Java 实现可插入的外观感觉swing 组件的多样化MVC(Model-View-Control) 体系结构可存取性支持(实现了 Accessible 接口)支持键盘操作设置边框 (Border)使用图标 (Icon)

Page 5: swing  基础一

swing 组成包 swing 包是 JFC ( Java Foundation Classes )的一部分,由许多包组成 : javax.swing

javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo

Page 6: swing  基础一

swing 的类层次结构 在 javax.swing 包中,定义了两种类型的组件:顶层容器 (JFrame,JDialog,JApplet 和 JWindow) 和轻量级组件。 swing 组件绝大部分都是 AWT 的 Container 类的直接子 类和间接子类。

java.awt.Componentjava.awt.Container

java.awt.Windowjavax.swing.JWindowjava.awt.Frame——javax.swing.JFramejava.awt.Dialog——javax.swing.JDialogjava.awt.Pane java.awt.Applet——javax.swing.JApplet

javax.swing.JComponet——swing 轻量级组件

Page 7: swing  基础一

轻量组件 JComponent 类 JComponent 类是所有轻量组件的父类 ;JComponent 类是 java.awt 包中容器类 Container 类的子类 , 因此所有的轻量组件也都是容器 :

AbstractButton JButtonJColorChooser JToggleButton JRadioButtonJComboBox JMenuItem JCheckBoxMenuItemJFileChooser JMenuJLabel JRadioButtonMenuItemJPanelJPopupMenuJProgressBarJSliderJTabbedPaneJTableJToolBar JEditorPane JTextPane JTree JTextAreaJTextComponent JTextField JPasswordField

Page 8: swing  基础一

swing 组件的分类

顶层容器 ( 共四个 )JFrame, JDialog, JApplet, JWindow

普通容器,使用在各种不同情况下的中间容器JPanel, JScrollPane, JSplitPane,JTabbedPane,JOptionPane

特殊容器,在 GUI 上起特殊作用的中间容器JInternalFrame, JLayeredPane, JRootPane, JToolBar

基本控件,实现人 - 机交互的组件JBtton, JComboBox,JList, JMenu, JSlider, JTextField

不可编辑信息的显示JLabel, JProgressBar, JToolTip

可编辑的格式化信息的显示JColorChooser, JFileChooser, JTable, JTextField,JTextArea, JTree

swing 组件从功能上分可以划分为以下几类 :

Page 9: swing  基础一

顶层容器 (JFrame)

称 JFrame 类或它的子类创建的窗体是 swing 窗体 ;不可以把组件直接填加到 swing 窗体中 .Swing 窗体含有一个称为内容面板的容器 , 应当把组件填加到 内容面板中 ( 内容面板也是重量容器 )不能为 swing 窗体设置布局 , 而应当为 swing 窗体的内容面板 设置布局 . 内容面板的默认布局是 BorderLayout 布局Swing 窗体通过调用 getContentPane() 方法得到它的内容面板 .

java.swing 包中的 JFrame 类是 java.awt 包中 Frame 类的子类 .因此 JFrame 类及其子类创建的对象是窗体 . 由于 Frame 是重量容器 , 因此 JFrame 类或子类创建的对象 ( 窗体 ) 也是重量容器 .

JFrame 类除了父类提供的功能外 , 还具有许多新的特性 :

Page 10: swing  基础一

JFrame 示例package test.jframe.windowdemo;

import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;

import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextArea;

public class MyFrame extends JFrame {private JButton button = null;private JTextArea text = null;

Page 11: swing  基础一

JFrame 示例 ( 接上 )

public MyFrame(String title) { super(title); init();}

private void init() { button = new JButton(" 轻组件按钮 "); text = new JTextArea(" 轻组件 ", 20, 20);

Container conr = this.getContentPane(); conr.add(button, BorderLayout.SOUTH); conr.add(text, BorderLayout.CENTER);}

Page 12: swing  基础一

JFrame 示例 ( 接上 )

public static void main(String args[]) {

MyFrame myFrame = new MyFrame(" 根窗体 "); myFrame.setSize(200, 300); myFrame.setBackground(Color.BLUE);

myFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); myFrame.setLocationRelativeTo(null);

myFrame.setVisible(true); myFrame.pack();

}

Page 13: swing  基础一

总结 (JFrame)

swing 窗体与普通的窗体相比是一类特殊的窗体 ;

使用 swing 窗体时除遵循上述的五点外还应注意 :

在 swing 窗体的内容面板中尽量不要既有重量组件又有轻量 组件 , 最好只使用轻量组件 . 否则可能会出现预想不到的问题。

Page 14: swing  基础一

顶层容器 (JDialog) JDialog 是 java.awt 包中 Dialog 类的子类, JDialog 类或子类创建的对象也是重量容器,该对象必须依附一个 JFrame 对象。 常用构造方法 : JDialog(JFrame f,String s);

JDialog 除了具有和 Dialog 相同的特征 ( 如 : 分有模 , 无模 )外使用时还有以下规定 :

不可以把组件直接添加到对话框中。 JDialog 型对话框也含有一个称为内容面板的容器,应当把组件添加到内容面板中( 这个内容面板是重量容器 ) 。不能为对话框设置布局,而就当为对话框的内容面板设置布局。内容面板的默认布局是 BorderLayout 布局 .对话框架通过调用 getContentPane() 方法得到内容面板 .

Page 15: swing  基础一

JDialog 示例package test.jframe.dialogdemo;

import java.awt.BorderLayout;import java.awt.Color;

import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;

public class MyFrame extends JFrame { public MyFrame(String title) { super(title); } public static void main(String args[]) { MyFrame myFrame = new MyFrame(" 根窗体 ");

myFrame.setSize(300, 300); myFrame.setBackground(Color.BLUE);

Page 16: swing  基础一

JDialog 示例 ( 接上 )myFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);myFrame.setLocationRelativeTo(null);myFrame.setVisible(true);

JDialog myDialog=new JDialog(myFrame,"swing 对话框 ");JButton button=new JButton(" 轻组件按钮 ");myDialog.getContentPane().add(button,BorderLayout.SOUTH);myDialog.setSize(200,200);myDialog.setModal(true);myDialog.setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE);myDialog.setLocationRelativeTo(myFrame);myDialog.setVisible(true);

}}

Page 17: swing  基础一

swing 事件处理 重量组件的事件处理模式 : 授权处理模式 , 仍适合于轻组件的事件处理,即事件源、监视器和接口,事件由事件源产生,为了能处理相应类型的事件,事件源必须使用相应的方法获得监视器。当事件发生时,监视器使用接口中的方法对事件进行处理。即 swing 事件处理方式方法与 awt 完全相同 ;

swing 能产生 awt 中事件外,还能产生特有的事件 , 在事件包 (javax.swing.event) 中

Page 18: swing  基础一

中间容器

JPanel 特性及作用和 panel 相同 ; 常用构造方法 : JPanel(); JPanel(LayoutManager lm);JScrollPane 和 ScrollPane 相同 ; 常用构造访求 : JScrollPane(Component c);JSplitPane 用于拆分窗口 ;内部窗体 JInternalFrame( 作为了解内容 )

我们已经知道轻组件都是容器,但仍有一些经常用来添加组件的轻容器,相对于底层重量容器而言,我们习惯上称这些轻容器为中间容器。 常用中间容器有 :

Page 19: swing  基础一

中间容器 (JSplitPane)

JSplitPane(int alignment,Component c1,Component c2); 参数 alignment 取 JSplitPane静态常量 HORIZONTAL_SPLIT 或 VERTICAL_SPLIT ,以决定水平还是垂直拆分,后两个参决定要放置的组件,当拆分线移动时,组件不是连续变化的 .JSplitPane(int alignment,boolean b,Component c1, Component c2); 参数 b决定当拆分线移动时,组件是否连续变化 (true 是连续 )

拆分窗口就是被分成两部分的窗口。拆分窗口有两种类型:水平拆分和垂直拆分。水平拆分窗口用一条拆分线把窗口分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动。垂直拆分窗口用一条拆分线把窗口分成上下两部分,上面放一个组件,下面一个组件,拆分线可以垂直移动。 两个常用构造方法 :

Page 20: swing  基础一

示例package test.jsplitpane;

import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JSplitPane;

public class MyFrame extends JFrame {private JSplitPane lv=null;private JSplitPane th=null;

private JLabel luLabel=null;private JLabel ldLabel=null;private JLabel rLabel=null;

public MyFrame(String title){super(title);init();

}

Page 21: swing  基础一

示例 ( 接上 )private void init(){

luLabel=new JLabel("左上 ");ldLabel=new JLabel("左下 ");rLabel=new JLabel("右边 ");lv=new JSplitPane(

JSplitPane.VERTICAL_SPLIT, luLabel,ldLabel);

lv.setDividerLocation(150);th=new JSplitPane(

JSplitPane.HORIZONTAL_SPLIT, lv,rLabel); // 设第一个组件高度或宽度 .

th.setDividerLocation(150); // 使 分隔条上提供一个 UI 小部件来快速展开 /折叠分隔条。

th.setOneTouchExpandable(true);this.getContentPane().add(th);

}

Page 22: swing  基础一

示例 ( 接上 )

public static void main(String args[]){

MyFrame myFrame=new MyFrame(" 根窗体 ");myFrame.setSize(300,300);

myFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);

myFrame.setLocationRelativeTo(null);

myFrame.setVisible(true);

} }

Page 23: swing  基础一

swing 常用组件的使用 使用 Swing 组件的基本规则

把 Swing 组件放入一个顶层 Swing 容器中避免使用非 Swing 的重量级组件与 AWT 不同, Swing 组件不能直接加到顶层 Swing 容器中,它们必须加到一个与 Swing 顶层容器相关的内容面板(content pane) 上。不能用 add( ) 方法向顶层容器加入组件用 getContentPane( ) 方法获得一个 Container 对象,调用该 Container 对象的 add( ) 方法加入 Swing 组件缺省的布局策略是 BorderLayout

Page 24: swing  基础一

常用组件使用常用组件使用 :

按钮与标签 (JButton,JLabel)

文本框和文本区 (JTextField,JPasswordField,JTextArea)

选择型组件 (JCheckbox,)

Page 25: swing  基础一

图标及键盘操作

ImageIcon 构造参数 :图片路径 (path)URL(推荐 )

支持键盘操作 :setMnemonic(KeyEvent.VK_E);

Page 26: swing  基础一

设置边框 (Border)

BorderFactory调用静态方法生产边框

Panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Edit the HTML, then click the button"),BorderFactory.createEmptyBorder(10,10,10,10)));

Page 27: swing  基础一

Swing 布局管理 和 AWT 相同,为了容器中的组件能实现平台无关的自动合理排列, Swing 也采用了布局管理器来管理组件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。

Swing 新增加了一个 BoxLayout 布局管理器 BoxLayout 布局管理器按照自上而下( y轴)或者从左到右( x轴)的顺序布局依次加入组件。建立一个 BoxLayout 对象,必须指明两个参数:被布局的容器和 BoxLayout 的主轴。缺省情况下,组件在纵轴方向上居中对齐。 设置布局管理器的方法如下:pane.setLayout(new BoxLayout(pane , BoxLayout.Y-AXIS));

Page 28: swing  基础一

Box 布局 用 BoxLayout 类可以创建一个布局对象,称为盒式布局。 BoxLayout 在 javax.swing.border 包中。 javax.swing 包提供了 Box 类,该类创建的容器称作一个盒子式容器,盒式容器的默认布局就是盒式布局,而且不允许更改盒式容器的布局 , 使用盒子式布局的容器针组件排列在一行或一列 ;

一般我们直接用 Box 类创建盒式布局的容器 ;

创建方法 :行排列 :Box. Box.createHorizontalBox()列排列 :Box hBox=Box.createVerticalBox();

Page 29: swing  基础一

示例package layout.box;

import java.awt.BorderLayout;import javax.swing.Box;import javax.swing.JButton;import javax.swing.JFrame;

public class MyFrame extends JFrame {private JButton button1 = null;private JButton button2 = null;private JButton button3 = null;private JButton button4 = null;private JButton button5 = null;public MyFrame(String title) {

super(title);init();

}

Page 30: swing  基础一

示例 ( 接上 )private void init() {

button1 = new JButton(" 按钮 1");button2 = new JButton(" 按钮 2");button3 = new JButton(" 按钮 3");button4 = new JButton(" 按钮 4");button5 = new JButton(" 按钮 5");

Box hBox=Box.createHorizontalBox();//Box hBox=Box.createVerticalBox();

hBox.add(button1);hBox.add(Box.createHorizontalStrut(10));hBox.add(button2);hBox.add(Box.createHorizontalGlue());hBox.add(button3);hBox.add(button4);hBox.add(button5);

Page 31: swing  基础一

示例 ( 接上 )

this.getContentPane().add(hBox, BorderLayout.CENTER); } public static void main(String[] args) {

myFrame = new MyFrame("BoxLayout 窗口 ");myFrame.setSize(530, 438);myFrame.setVisible(true);

}}

Page 32: swing  基础一

选项窗格 (tabbed pane)

选项窗格组件表现为一组文件夹 .每个文件夹都有标题 . 当用户使用文件夹时 , 显示它的内容 .每次只能选择组中的一个文件夹 .选项窗格被封装为 JTabbedPane 类 , 添加选项方法如下 :

void addTab(String str,Component comp)

Page 33: swing  基础一

JOptionPane消息对话框 利用 JOptionPane 类中的各个 static 方法来生成各种标准的对话框,实现显示出信息、提出问题、警告、用户输入参数等功能。这些对话框都是模式对话框。 消息类型 :

错误信息 ERROR_MESSAGE 普通消息 INFORMATION_MESSAGE警告信息 WARNING_MESSAGE问题信息 QUESTION_MESSAGE文本信息 PLAIN_MESSAGE

选择项目类型 :DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCEL_OPTION