Topic: Swing读书笔记 |
Print this page |
1.Swing读书笔记 | Copy to clipboard |
Posted by: wizards Posted on: 2004-03-14 21:32 1-1:Swing常用的package PACHAGE | 内 容 -----------------|------------------------------- 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衍生而来,也就是说这些组件都是lightweight Component,均由纯java code所编写面成 、Swing中以下几个组件不是由JComponent继承面来: JFrame(JRoot Pane) JDialog(JRoot Pane) JWindow(JRoot Pane) JApplet(JRoot Pane) 以上四个组件是heavyweight Component,必须使用到native code来画出这四个窗口组件,因为要在操作系统中显示窗口画面,必 须使用操作系统的宣传品资源,面以往的AWT组件大多使用native code所构造出来,因此Swing中的JFrame便继承原有AWT中的Frame 类,面不是继承JComponent类。同样,JApplet是继承原有AWT中的JApplet类,也不是继承JComponent类。 JFrame、JDialog、JWindow及JApplet这四个组件统称为最上层组件,因为其余的swing组件都必须依附在此四组件之一上才能 显示出来。此四组件均实现(Implement)RootPaneContainer这个界面(Interface),此界面定义了各种容器取得与设置并不是真实的容器,它是由Glass Pane与Layered Pane所组成(Layered Pane里拥有Content Pane与Menu Bar,而Menu Bar可选择使用或不使用), 我们不能在JRootPane上加入任何的组件,因为它只是一个虚拟的容器,若要在最上层组件上加入组件,必须加在Layered Pane或是 Layered Pane里的Content Pane上。以JFrame为例,一般我们要在JFrame上加入其他组件(如JButton、JLabel等)必须先取得JFrame 的Content Pane,然后将要加入的组件放在此Content Pane中,而不是直接就加到JFrame上。因此若要在JFrame中加入一个按钮,不 能像以前AWT时一样写成frame.add(button)的形式,而必须先取得JFrame的Content Pane,然后将按钮加入Content Pane中,如: frame.getContentPane().add(button) 否则在编译的时候将有错误信息产生。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 注意: 1.组件必须加在容器中,而容器本身具有层次性的关系,就如同珠宝盒一般,大盒子里面可以放小盒子,小盒子里面还可以放更小的盒子,而珠宝就可以放在某一个盒子中,这里的珠宝就代表组件,盒子就代表容器。因此若您想在JFrame加入任何组件时,必须 先取得JFrame的容器来放置这些组件,而由于JFrame、JDialog、JWindow与JApplet是显示Swing组件的源头,我们可以称它们为根 组件,也就是所谓的最上层组件。 2.RootPaneContainer它是一个interface,共有5个类实现(Implement)它,分别是JFrame、JAppleet、JWindow、JDialog、 JInternalFrame,其中JInternalFrame是一个lightweight Component,它不是一个最上层组件,也就是说JInternalFrame不能单独显示出来,必须依附在最上层组件中,我们将在下面讨论组件,而JFrame,JApplet,JWindow,JDialog均为最上层组件。 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& RootPaneContainer定义了下面几种方法: 方法 Container getContentPane()返回contentPane Component getGlassPane()返回glassPane JLayeredPane getLayeredPane()返回layeredPane JRootPane getRootPane返回属于这个组件的JRootPane Void setContentPane(Container contentpane)设置ContentPane Void setGlassPane(Component glassPane)设置GlassPane Void setLayeredPane(JLayeredPane layeredPane)设置LayeredPane JFrame如何取得Content Pane的实际流程,下面是一段很简单的程序代码: public class Simple{ Simple(){ JFrame frame=new JFrame(); Container contentPane=frame.getContentPane(); JButton button=new JButton(); contentPane.add(button); } } 当我们写frame.getContentPane()时,会返回此frame的Content Pane,也就是一个容器组件,有了容器之后我们才能将button组件 摆进去,此时JFrame才算拥有button组件。所以JFrame就好像是一块空地,要在这空地上信人应该先盖一栋房子(容器),然后人 、家具、设备等等(组件)就能搬进此房子中。下面的层次结构说明了最上层组件都含有JRootPane组件,JRootPane本身就含有容 器组件,可让最上层组件装入其他的组件。 |Frame------JFrame(JRoot Pane) | Window|Dialog-----JDialog(JRoot Pane) | | |-----------JWindow(JRoot Pane) Applet -----------JApplet(JRoot Pane) 图示: |Grass Pane | Root Pane| | |Content Pane |Layered Pane| |Menu Bar 1-3:版面管理器(Layout Menager) |BorderLayout |FlowLayout |GridLayout AWT----|CardLayout |GridBagLayout Swing--|BoxLayout 1-3-1:BorderLayout的使用: BorderLayout的类层次结构图: java.lang.Object --java.awt.BorderLayout 构造函数:BorderLayout()建立一个没有间距的border layout BorderLayout(int hgap,int vgap)建立一个组件间有间距的border layout BorderLayout将版面划分为东、西、南、北、中 例子:BorderLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo{ public BorderLayoutDemo(){ JFrame f=new JFrame(); Container contentPane=f.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(new JButton("EAST"),BorderLayout.EAST); contentPane.add(new JButton("WEST"),BorderLayout.WEST); contentPane.add(new JButton("SOUTH"),BorderLayout.SOUTH); contentPane.add(new JButton("NORTH"),BorderLayout.NORTH); contentPane.add(new JLabel("CENTER",JLabel.CENTER),BorderLayout.CENTER); f.setTitle("BorderLayout"); f.pack(); f.setVisible(true); /***read**/ /*处理关闭窗口的操作,若你没写这一段,就算你已经关闭窗口了,但程序并不会终止。 */ f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); /***read**/ } public static void main(String[] args){ BorderLayoutDemo b=new BorderLayoutDemo(); } } 设置组件的间距,你可以使用有间距参数的BorderLayout构造函数,也可以利用BorderLayout的setHgap(int hgap)与 setVgap(int vgap)两个方法来达成。 1-3-2:FlowLayout的使用: FlowLayout的类层次结构图: java.lang.Object --java.awt.FlowLayout 构造函数:FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。 FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直 间距。 FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。 FlowLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FlowLayoutDemo{ public FlowLayoutDemo(){ JFrame f=new JFrame(); Container contentPane=f.getContentPane(); /*你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并 *并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式, *依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13 *行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); */ contentPane.setLayout(new FlowLayout()); contentPane.add(new JButton("first")); contentPane.add(new JButton("second")); contentPane.add(new JButton("third")); contentPane.add(new JButton("fourth")); contentPane.add(new JButton("fifth")); contentPane.add(new JButton("Last")); f.setTitle("FlowLayout"); //f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用 f.setSize(400,220); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ FlowLayoutDemo b=new FlowLayoutDemo(); } } 1-3-3:GridLayout的使用: GridLayout的类层次结构图: java.lang.Object --java.awt.GridLayout GridLayout比FlowLayout多了行和列的设置,也就是说你要先设置GridLayout共有几行几列,就如同二维平面一般,然后你加 进去的组件会先填第一行的格子,然后再从第二行开始填,依此类扒,就像是一个个的格子一般。而且GridLayout会将所填进去组 件的大小设为一样。 构造函数:GridLayout()建立一个新的GridLayout,默认值是1行1列。 GridLayout(int rows,int cols)建立一个几行几列的GridLayout. GridLayout(int rows,int cols, int hgap,int vgap)建立一个几行几列的GridLayout,并设置组件的间距。 例子:GridLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CardLayoutDemo implements ActionListener{ JPanel p1,p2,p3,p4; int i=1; JFrame f; public CardLayoutDemo(){ f=new JFrame();//当做top-level组件 Container contentPane=f.getContentPane(); contentPane.setLayout(new GridLayout(2,1)); p1=new JPanel(); Button b=new Button("Change Card"); b.addActionListener(this);//当按下"Change Card"时,进行事件监听,将会有系统操作产生。 p1.add(b); //处理操作在52-64行. contentPane.add(p1); p2=new JPanel(); p2.setLayout(new FlowLayout()); p2.add(new JButton("first")); p2.add(new JButton("second")); p2.add(new JButton("third")); p3=new JPanel(); p3.setLayout(new GridLayout(3,1)); p3.add(new JButton("fourth")); p3.add(new JButton("fifth")); p3.add(new JButton("This is the last button")); p4=new JPanel(); p4.setLayout(new CardLayout()); p4.add("one",p2); p4.add("two",p3); /*要显示CardLayout的卡片,除了用show(Container parent,String name)这个方法外 *,也可试试first(Container),next(Container),previous(Container),last(Container)这 *四个方法,一样可以达到显示效果。 */ ((CardLayout)p4.getLayout()).show(p4,"one"); contentPane.add(p4); f.setTitle("CardLayout"); f.pack(); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public void actionPerformed(ActionEvent event){ switch(i){ case 1: ((CardLayout)p4.getLayout()).show(p4,"two"); break; case 2: ((CardLayout)p4.getLayout()).show(p4,"one"); break; } i++; if (i==3) i=1; f.validate(); } public static void main(String[] args){ new CardLayoutDemo(); } } 1-3-5:GridBagLayout的使用:是java中最有弹性但也是最复杂的一种版面管理器。它只有一种构造函数,但必须配合 GridBagConstraints才能达到设置的效果。 GridBagLayout的类层次结构图: java.lang.Object --java.awt.GridBagLayout 构造函数: GirdBagLayout()建立一个新的GridBagLayout管理器。 GridBagConstraints()建立一个新的GridBagConstraints对象。 GridBagConstraints(int gridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty, int anchor,int fill, Insets insets,int ipadx,int ipady)建立一个新的GridBagConstraints对象 ,并指定其参数的值。 参数说明: gridx,gridy:设置组件的位置,gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。 若将gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。建议定义出 gridx,gridy的位置,以便以后维护程序。表示放在几行几列,gridx=0,gridy=0时放在0行0列。 gridwidth,gridheight:用来设置组件所占的单位长度与高度,默认值皆为1。你可以使用GridBagConstraints.REMAINDER常 量,代表此组件为此行或此列的最后一个组件,而且会占据所有剩余的空间。 weightx,weighty:用来设置窗口变大时,各组件跟着变大的比例,当数字越大,表示组件能得到更多的空间,默认值皆为0。 anchor: 当组件空间大于组件本身时,要将组件置于何处,有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、 WEST、NORTHWEST可供选择。 insets:设置组件之间彼此的间距,它有四个参数,分别是上,左,下,右,默认为(0,0,0,0). ipadx,ipady:设置组件内的间距,默认值为0。 我们以前提过,GridBagLayout里的各种设置都必须通过GridBagConstraints,因此当我们将GridBagConstraints的参数都设置 好了之后,必须new一个GridBagConstraints的对象出来,以便GridBagLayout使用。 例子: GridBagLayoutDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GridBagLayoutDemo{ public GridBagLayoutDemo(){ JButton b; GridBagConstraints c; int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady; double weightx,weighty; Insets inset; JFrame f=new JFrame(); GridBagLayout gridbag=new GridBagLayout(); Container contentPane=f.getContentPane(); contentPane.setLayout(gridbag); b=new JButton("first"); gridx=0; gridy=0; gridwidth=1; gridheight=1; weightx=10; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("second"); gridx=1; gridy=0; gridwidth=2; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=50; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("third"); gridx=0; gridy=1; gridwidth=1; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=50; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("fourth"); gridx=1; gridy=1; gridwidth=1; gridheight=1; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=0; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); b=new JButton("This is the last button"); gridx=2; gridy=1; gridwidth=1; gridheight=2; weightx=1; weighty=1; anchor=GridBagConstraints.CENTER; fill=GridBagConstraints.HORIZONTAL; inset=new Insets(0,0,0,0); ipadx=0; ipady=50; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor, fill,inset,ipadx,ipady); gridbag.setConstraints(b,c); contentPane.add(b); f.setTitle("GridBagLayout"); f.pack(); f.setVisible(true); f.addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); } public static void main(String[] args){ new GridBagLayoutDemo(); } } |
2.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: Jove Posted on: 2004-03-14 22:06 赞! 可惜jute没有空格转义, 格式上有欠美观 下面这个htm版的或许好些 Click here to open a new window a.htm (165.34k) |
3.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: wizards Posted on: 2004-03-15 00:13 谢谢整理!:) |
4.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: iamluli Posted on: 2004-03-30 10:15 Thank you,!!!studying gui now |
5.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: dannyxu Posted on: 2004-04-21 15:15 最近在做一个java GUI的项目,有帮助 |
6.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: freefish Posted on: 2004-04-28 11:21 整理的不错 支持 |
7.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: wolfsquare Posted on: 2004-04-28 11:34 拜托,不是原创的请注明转贴来源和作者。 |
8.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: xidianliuy Posted on: 2004-05-28 23:24 哈哈哈,好得很,找了很久了!!!!好贴要转发!!! |
9.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: southforest Posted on: 2004-06-07 08:19 不错,正在找呢,就找到了.3x |
10.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: hexianmao Posted on: 2004-06-18 11:03 不错,顶。。。 |
11.Re:Swing读书笔记 [Re: wizards] | Copy to clipboard |
Posted by: buaacyk Posted on: 2004-07-01 13:16 Thanks |
12.Re:Swing读书笔记 [Re: buaacyk] | Copy to clipboard |
Posted by: caike Posted on: 2004-07-01 16:12 不错,顶,我现在也在做GUI,有空我也整理一下 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |