++Swing读书笔记1-1:Swing常用的packagePACHAGE|内容-----------------|-------------------------------javax.swing|最常用的pachage,包含了各种swing组件的类javax.swing.border|包含与swing组件外框有关的类javax..swing.colorchooser|针对swing调色盘组件(JColorChooser)所设计的类javax.swing.event|处理由swing组件产生的事件,有别于AWT事件javax.swing.filechooser|包含针对swing文件选择对话框(JFileChooser)所设计的类----------------------------------------------javax.swing.plaf|处理swing组件外观的相关类javax.swing.plaf.basic|javax.swing.plaf.metal|javax.swing.plaf.multi|----------------------------------------------javax.swing.table|针对swing表格组件(JTable)所设计的类----------------------------------------------javax.swing.text|包含与swing文字组件相关的类javax.swing.text.html|javax.swing.text.html.parser|javax.swing.text.rtf|----------------------------------------------javax.swing.tree|针对swing树关元件(JTree)所设计的类javax.swing.undo|提供swing文字组件Redo或Undo的功能1-2:swing的版面结构Swing中几乎所有组件都是从JComponent衍生而来,也就是说这些组件都是lightweightComponent,均由纯javacode所编写面成、Swing中以下几个组件不是由JComponent继承面来:JFrame(JRootPane)JDialog(JRootPane)JWindow(JRootPane)JApplet(JRootPane)以上四个组件是heavyweightComponent,必须使用到nativecode来画出这四个窗口组件,因为要在操作系统中显示窗口画面,必须使用操作系统的窗口资源,而以往的AWT组件大多使用nativecode所构造出来,因此Swing中的JFrame便继承原有AWT中的Frame类,面不是继承JComponent类。同样,JApplet是继承原有AWT中的JApplet类,也不是继承JComponent类。JFrame、JDialog、JWindow及JApplet这四个组件统称为最上层组件,因为其余的swing组件都必须依附在此四组件之一上才能显示出来。此四组件均实现(Implement)RootPaneContainer这个界面(Interface),此界面定义了各种容器取得与设置并不是真实的容器,它是由GlassPane与LayeredPane所组成(LayeredPane里拥有ContentPane与MenuBar,而MenuBar可选择使用或不使用),我们不能在JRootPane上加入任何的组件,因为它只是一个虚拟的容器,若要在最上层组件上加入组件,必须加在LayeredPane或是LayeredPane里的ContentPane上。以JFrame为例,一般我们要在JFrame上加入其他组件(如JButton、JLabel等)必须先取得JFrame的ContentPane,然后将要加入的组件放在此ContentPane中,而不是直接就加到JFrame上。因此若要在JFrame中加入一个按钮,不能像以前AWT时一样写成frame.add(button)的形式,而必须先取得JFrame的ContentPane,然后将按钮加入ContentPane中,如:frame.getContentPane().add(button)否则在编译的时候将有错误信息产生。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&注意:1.组件必须加在容器中,而容器本身具有层次性的关系,就如同珠宝盒一般,大盒子里面可以放小盒子,小盒子里面还可以放更小的盒子,而珠宝就可以放在某一个盒子中,这里的珠宝就代表组件,盒子就代表容器。因此若您想在JFrame加入任何组件时,必须先取得JFrame的容器来放置这些组件,而由于JFrame、JDialog、JWindow与JApplet是显示Swing组件的源头,我们可以称它们为根组件,也就是所谓的最上层组件。2.RootPaneContainer它是一个interface,共有5个类实现(Implement)它,分别是JFrame、JAppleet、JWindow、JDialog、JInternalFrame,其中JInternalFrame是一个lightweightComponent,它不是一个最上层组件,也就是说JInternalFrame不能单独显示出来,必须依附在最上层组件中,我们将在下面讨论组件,而JFrame,JApplet,JWindow,JDialog均为最上层组件。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RootPaneContainer定义了下面几种方法:方法ContainergetContentPane()返回contentPaneComponentgetGlassPane()返回glassPaneJLayeredPanegetLayeredPane()返回layeredPaneJRootPanegetRootPane返回属于这个组件的JRootPaneVoidsetContentPane(Containercontentpane)设置ContentPaneVoidsetGlassPane(ComponentglassPane)设置GlassPaneVoidsetLayeredPane(JLayeredPanelayeredPane)设置LayeredPaneJFrame如何取得ContentPane的实际流程,下面是一段很简单的程序代码:publicclassSimple{Simple(){JFrameframe=newJFrame();ContainercontentPane=frame.getContentPane();JButtonbutton=newJButton();contentPane.add(button);}}当我们写frame.getContentPane()时,会返回此frame的ContentPane,也就是一个容器组件,有了容器之后我们才能将button组件摆进去,此时JFrame才算拥有button组件。所以JFrame就好像是一块空地,要在这空地上信人应该先盖一栋房子(容器),然后人、家具、设备等等(组件)就能搬进此房子中。下面的层次结构说明了最上层组件都含有JRootPane组件,JRootPane本身就含有容器组件,可让最上层组件装入其他的组件。|Frame------JFrame(JRootPane)|Window|Dialog-----JDialog(JRootPane)|||-----------JWindow(JRootPane)Applet-----------JApplet(JRootPane)图示:|GrassPane|RootPane|||ContentPane|LayeredPane||MenuBar++Swing读书笔记1-3:版面管理器(LayoutMenager)|BorderLayout|FlowLayout|GridLayoutAWT----|CardLayout|GridBagLayoutSwing--|BoxLayout1-3-1:BorderLayout的使用:BorderLayout的类层次结构图:java.lang.Object--java.awt.BorderLayout构造函数:BorderLayout()建立一个没有间距的borderlayoutBorderLayout(inthgap,intvgap)建立一个组件间有间距的borderlayoutBorderLayout将版面划分为东、西、南、北、中例子:BorderLayoutDemo.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassBorderLayoutDemo{publicBorderLayoutDemo(){JFramef=newJFrame();ContainercontentPane=f.getContentPane();contentPane.setLayout(newBorderLayout());contentPane.add(newJButton(EAST),BorderLayout.EAST);contentPane.add(newJButton(WEST),BorderLayout.WEST);contentPane.add(newJButton(SOUTH),BorderLayout.SOUTH);contentPane.add(newJButton(NORTH),BorderLayout.NORTH);contentPane.add(newJLabel(CENTER,JLabel.CENTER),BorderLayout.CENTER);f.setTitle(BorderLayout);f.pack();f.setVisible(true);/***read**//*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。*/f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});/***read**/}publicstaticvoidmain(String[]args){BorderLayoutDemob=newBorderLayoutDemo();}}设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(inthgap)与setVgap(intvgap)两个方法来达成。1-3-2:FlowLayout的使用:FlowLayout的类层次结构图:java.lang.Object--java.awt.FlowLayout构造函数:FlowLayout()建立一个新的FlowLayout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。FlowLayout(intalign)建立一个新的FlowLayout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直间距。FlowLayout(intalign,inthgap,intvgap)建立一个新的FlowLayout,此FlowLayout可设置排列方式与组件间距。FlowLayoutDemo.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publi