330 likes | 782 Views
swing 基础一. æœ¬èŠ‚ç›®æ ‡. 认识 swing swing 组件和容器 swing å¸ƒå±€ç®¡ç† å¸¸ç”¨ç»„ä»¶. swing 简介. 我们已ç»å¦è¿‡ java.awt 包 , 这些类创建的对象称为组件 , 当我们用这些类创建一个组件时 , 都有一个相应的本地组件在为它工作 ( 称为åŒä½ä½“ ),AWT 组件的设计原ç†æ˜¯æŠŠä¸Žæ˜¾ç¤ºç»„件有关的许多工作和处ç†ç»„件事件的工作交给相应的本地组件 . å› æ¤æˆ‘们把有åŒä½çš„组件称为é‡é‡ç»„件 , 基于é‡é‡ç»„件的 GUI 设计有很多ä¸è¶³ä¹‹å¤„ ; 如 :a. 显示与平å°æœ‰å…³ ,b. ä¸çµæ´» ( ä¸èƒ½å›¾ç‰‡æ·»åŠ 到按钮上 ) 。
E N D
本节目标 • 认识swing • swing组件和容器 • swing布局管理 • 常用组件
swing简介 我们已经学过java.awt包,这些类创建的对象称为组件,当我们用这些类创建一个组件时,都有一个相应的本地组件在为它工作(称为同位体),AWT组件的设计原理是把与显示组件有关的许多工作和处理组件事件的工作交给相应的本地组件.因此我们把有同位的组件称为重量组件,基于重量组件的GUI设计有很多不足之处;如:a.显示与平台有关,b.不灵活(不能图片添加到按钮上) 。 swing是由100%纯Java实现的,swing组件是用java实现的轻量级( light- weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区 别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组 件具有更强的实用性。swing在不同的平台上表现一致,并且有能力提供本地窗 口系统 不支持的其它特性,因为轻组件把与显示有关的许多工 作和处理组件的工作交给相应的UI代表来完成.。
swing特性 • 从AWT继承 • 100%的纯Java实现 • 可插入的外观感觉 • swing组件的多样化 • MVC(Model-View-Control)体系结构 • 可存取性支持(实现了Accessible接口) • 支持键盘操作 • 设置边框(Border) • 使用图标(Icon)
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
swing的类层次结构 • 在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JDialog,JApplet和JWindow)和轻量级组件。swing组件绝大部分都是AWT的Container类的直接子 类和间接子类。 • java.awt.Component • java.awt.Container • java.awt.Window • javax.swing.JWindow • java.awt.Frame——javax.swing.JFrame • java.awt.Dialog——javax.swing.JDialog • java.awt.Pane • java.awt.Applet——javax.swing.JApplet • javax.swing.JComponet——swing轻量级组件
轻量组件JComponent类 JComponent类是所有轻量组件的父类;JComponent类是java.awt包中容器类Container类的子类,因此所有的轻量组件也都是容器 : • AbstractButton JButton • JColorChooser JToggleButton JRadioButton • JComboBox JMenuItem JCheckBoxMenuItem • JFileChooser JMenu • JLabel JRadioButtonMenuItem • JPanel • JPopupMenu • JProgressBar • JSlider • JTabbedPane • JTable • JToolBar JEditorPane JTextPane • JTree JTextArea • JTextComponent JTextField JPasswordField
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
顶层容器(JFrame) java.swing包中的JFrame类是java.awt包中Frame类的子类.因此JFrame类及其子类创建的对象是窗体.由于Frame是重量容器,因此JFrame类或子类创建的对象(窗体)也是重量容器. JFrame类除了父类提供的功能外,还具有许多新的特性: • 称JFrame类或它的子类创建的窗体是swing窗体; • 不可以把组件直接填加到swing窗体中. • Swing窗体含有一个称为内容面板的容器,应当把组件填加到 内容面板中(内容面板也是重量容器) • 不能为swing窗体设置布局,而应当为swing 窗体的内容面板 设置布局.内容面板的默认布局是BorderLayout布局 • Swing窗体通过调用getContentPane()方法得到它的内容面板.
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;
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); }
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(); }
总结(JFrame) • swing窗体与普通的窗体相比是一类特殊的窗体; • 使用swing窗体时除遵循上述的五点外还应注意: • 在swing窗体的内容面板中尽量不要既有重量组件又有轻量 组件,最好只使用轻量组件.否则可能会出现预想不到的问题。
顶层容器(JDialog) • JDialog是java.awt包中Dialog类的子类,JDialog类或子类创建的对象也是重量容器,该对象必须依附一个JFrame对象。 • 常用构造方法: JDialog(JFrame f,String s); • JDialog除了具有和Dialog相同的特征(如:分有模,无模)外使用时还有以下规定: • 不可以把组件直接添加到对话框中。JDialog型对话框也含有一个称为内容面板的容器,应当把组件添加到内容面板中(这个内容面板是重量容器)。 • 不能为对话框设置布局,而就当为对话框的内容面板设置布局。内容面板的默认布局是BorderLayout布局. • 对话框架通过调用getContentPane() 方法得到内容面板.
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);
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); • } • }
swing事件处理 • 重量组件的事件处理模式:授权处理模式,仍适合于轻组件的事件处理,即事件源、监视器和接口,事件由事件源产生,为了能处理相应类型的事件,事件源必须使用相应的方法获得监视器。当事件发生时,监视器使用接口中的方法对事件进行处理。即swing事件处理方式方法与awt完全相同; • swing能产生awt中事件外,还能产生特有的事件,在事件包(javax.swing.event)中
中间容器 • 我们已经知道轻组件都是容器,但仍有一些经常用来添加组件的轻容器,相对于底层重量容器而言,我们习惯上称这些轻容器为中间容器。 • 常用中间容器有: • JPanel 特性及作用和panel相同; 常用构造方法: JPanel(); JPanel(LayoutManager lm); • JScrollPane 和ScrollPane相同; 常用构造访求: JScrollPane(Component c); • JSplitPane 用于拆分窗口; • 内部窗体 JInternalFrame(作为了解内容)
中间容器(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是连续)
示例 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(); }
示例(接上) 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); }
示例(接上) 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); } }
swing常用组件的使用 • 使用Swing组件的基本规则 • 把Swing组件放入一个顶层Swing容器中 • 避免使用非Swing的重量级组件 • 与AWT不同,Swing组件不能直接加到顶层Swing容器中,它们必须加到一个与Swing顶层容器相关的内容面板(content pane)上。 • 不能用add( )方法向顶层容器加入组件 • 用getContentPane( )方法获得一个Container对象,调用该Container对象的add( )方法加入Swing组件 • 缺省的布局策略是BorderLayout
常用组件使用 • 常用组件使用: • 按钮与标签(JButton,JLabel) • 文本框和文本区(JTextField,JPasswordField,JTextArea) • 选择型组件(JCheckbox,)
图标及键盘操作 • ImageIcon构造参数: • 图片路径(path) • URL(推荐) • 支持键盘操作: • setMnemonic(KeyEvent.VK_E);
设置边框(Border) BorderFactory 调用静态方法生产边框 Panel.setBorder( BorderFactory.createCompoundBorder (BorderFactory.createTitledBorder("Edit the HTML, then click the button"), BorderFactory.createEmptyBorder(10,10,10,10)));
Swing布局管理 和AWT相同,为了容器中的组件能实现平台无关的自动合理排列,Swing也采用了布局管理器来管理组件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。 Swing新增加了一个BoxLayout布局管理器 BoxLayout布局管理器按照自上而下(y轴)或者从左到右(x轴)的顺序布局依次加入组件。建立一个BoxLayout对象,必须指明两个参数:被布局的容器和BoxLayout的主轴。缺省情况下,组件在纵轴方向上居中对齐。 设置布局管理器的方法如下:pane.setLayout(new BoxLayout(pane,BoxLayout.Y-AXIS));
Box布局 • 用BoxLayout类可以创建一个布局对象,称为盒式布局。BoxLayout在javax.swing.border包中。javax.swing包提供了Box类,该类创建的容器称作一个盒子式容器,盒式容器的默认布局就是盒式布局,而且不允许更改盒式容器的布局,使用盒子式布局的容器针组件排列在一行或一列; • 一般我们直接用Box类创建盒式布局的容器; • 创建方法: • 行排列:Box. Box.createHorizontalBox() • 列排列:Box hBox=Box.createVerticalBox();
示例 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(); }
示例(接上) 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);
示例(接上) this.getContentPane().add(hBox, BorderLayout.CENTER); } public static void main(String[] args) { myFrame = new MyFrame("BoxLayout窗口"); myFrame.setSize(530, 438); myFrame.setVisible(true); } }
选项窗格(tabbed pane) 选项窗格组件表现为一组文件夹.每个文件夹都有标题.当用户使用文件夹时,显示它的内容.每次只能选择组中的一个文件夹. 选项窗格被封装为JTabbedPane类, 添加选项方法如下: void addTab(String str,Component comp)
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