当前位置:文档之家› Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)

Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)

Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)
Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)

主要参考文现:

[美]Herbert Schildt 著 鄢爱兰 鹿江春译 《java 参考大全 J2SE 》 清华大学出版社 2006年1月

孙卫琴 《Java 面向对象编程》 出版社及日期不详

java API 开发人员文档

本文作者:黄邦勇帅

本文的说明:本文主要讲解了对大学初学Swing 时对根面板JRootPane ,内容面板containPane ,层面板JLayeredPane ,玻璃面板glassPnae 的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。

Swing 组件的各种面板(JRootPane 根面板,JLayeredPane 层面板等)

第一部分:JFrame 中各面板间的关系,透明性与可见性问题

注:在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。注意窗格与窗体是不一样的。 在Swing 中的JFrame 窗体与AWT 中的Frame 窗体有一些不同。JFrame 由他的窗体本身加上其上的JRootPane 根面板,JLayeredPane 层面板,containPane 内容面板,glassPane 玻璃面板,JMenuBar 菜单栏(可选,不包括在内)四部分组成。其中根面板在JRootPane 类中实现,层面板在JLayeredPane 类中实现,他们都是JComponent 的子类。而containPane 和glassPane 没有专门对应的类。

1、各种面板(或称窗格)的关系及作用:

JRootPane 根面板:该面板是在JFrame 窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame 窗体等。

JLayeredPane 层面板:该面板是其他所有面板的父级,在JRootPane 面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar 菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane 面板的顶部,剩下的部分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层,在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理各种内部窗体的叠放问题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。 containPane 内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一个JPane 对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT 那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb 则正确的方式为,Container p=jframe.getContentPane(); p.add(jr); 或jframe.getContentPane().add(jr); 其中getContentPane()是JFrame 类中的方法,该方法将反回内容面板的引用,这是访问默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。

glassPane 玻璃面板:该面板总是存在的,而且他位于最上面,默认情况下玻璃面板是不可见的,玻璃面板用于接收鼠标事件和在其他组件上绘图。

2、各面板中使用的布局管理器:

在内容面板上使用的布局管理器默认是BorderLayout 。

在根面板上使用的布局管理器是一个自定义的LayoutManager(布局管理器),他的作用是布局根面板之上的其他面板。很明显如果你要向根面板中添加组件就应使用setLayout 方法为其设置合适的布局管理器或自已设定组件的大小和显示

位置。如果你改变了根面板自定义的LayoutManager那么你就应编写负责布局根面板之上的各种面板的程序,如果没有这样的程序,那么在根面板之上的各种面板就不能正常的布局,因此对于根面板的布局管理器一般不要随便更改。玻璃面板的默认布局管理器是FlowLayout。

对于层面板而言,在将容器添加进层面板时,将在添加容器时指定把该容器添加进层面板的哪一层,因而某层的布局管理器由添加到该层的容器所决定,因此无需为层面板的某一层设置布局管理器,也就是说层面板没有布局管理器。当把某一容器(比如Panel)设为某种面板(内容面板)时,则面板的布局与添加进来的容器的布局管理器相同,比如把Panel 作为内容面板,则内容面板的布局管理器就是FlowLayout。

注意:对于层面板的各层来说,只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层。

3、各面板的可见性和透明性问题

可见性使用setVisible方法来显示(在AWT时已见过不少),透明性使用setOpaque方法来设置。setOpaque方法只有在javax.swing包中的组件才有,对于java.awt包中的组件是没有该方法的,因此要使用该方法有时需要使用强制类型转换

可见性与透明性的区别:区别在于,当面板是不可见时,则该面板中包含的组件也会不可见。若该面板是透明但可见的,则只是面板会透明(比如面板的背景色无法看到),但面板上的组件仍会显示。

根面板:默认情况下,根面板是可见且不透明的。

内容面板:默认情况下,内容面板是可见的且不透明的,因此我们创建的JFrame窗体,实际上看到的是内容面板中的内容。

玻璃面板:默认的玻璃面板是透明的且不可见的,因此要显示默认的玻璃面板应设置setVisible和setOpaque两个方法,若你把某一容器(比如Panel)设为玻璃面板,那么这时的玻璃面板仍然是不可见的,但他不是透明的,这取决于容器(比如Panel)是否是透明的。因此要把这种类型的玻璃面板显示出来只需设置setVisible方法就够了。

层面板:不管是你自已创建的层面板还是默认的层面板都是透明的且可见的,层面板中的内容面板是个特例,要使层面板可显示应设置setOpaque方法。

层面板和内容面板可见性与透明性的关系:内容面板默认在层面板的-30000层,若我们像层面板添加组件时应设置将该组件添加进层面板的哪一层,若不然就会出现一些问题,因此应使用add(Component com, Object constrainer)这个方法,在添加组件时使用add(com, new Integer(100));这样的形式,Integer对象是int装相后的结果,装相后把整数当作对象来看待,其实Integer对象就是一个整数。

内容面板和层面板及层面板之间的显示问题,因为只能把某种容器(比如Panel)设置为内容面板,不能把容器设置为层面板中的其他各层,我们也无法直接该问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外)且背景色使用JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。因此在层面板的各层之间他们始终是彼此透明的,无法更改,而相对与其他面板层面板(比如根面板)可以透明也可以不透明(使用JLayeredPane对象来设定)。而对于内容面板而言,由于内容面板是存在于层面板中的某一层,因此层面板中的其他层相对于内容面板也是透明的,无法更改。但是在层面板的所有层中只有内容面板是不透明的,因此若我们既为内容面板设置了背景色也为层面板设置了背景色那么最后只会显示内容面板的背景色,除非让内容面板透明或不可见,这时才会显示出层面板的背景色。当向层面板中添加的组件在内容面板之上(大于-30000)时,这些组件将与内容面板的组件同时显示(若不重叠的话,若重叠则显示层数数值更大的组件)。若向层面板中添加的组件在内容面板之下(小于-3000层),那么内容面板将把层面板中的组件都遮挡住,因为内容面板是不透明的。

应注意的问题:

1、containPane是JLayeredPane中的某一层。是我们的工作区间,组件都应该添加到该面板上。而不能像AWT那样

直接向Frame窗体添加组件。

2、可以创建JRootPane的对象,但无法把该对象设置为某一个窗体的根面板,因此一般情况下JFrame窗体的根面板

是唯一的。比如JRootPane jr=new JRootPane; 但不能使用JFrame中的jframe.setRootPane(jr);方法把jr设置为该窗体的根面板,因为setRootPane方法是protected类型的,只能由继承自该类的子类的构造方法使用。

3、关于设置面板的问题:对于JFrame窗口的根面板和层面板只能把JRootPane和JLayeredPane类型的对象设为根面

板和层面板,而不能把Component或Container类型的组件设为根面板或层面板。而对于玻璃面板则可以把Component类型的对象设为玻璃面板,对于内容面板可以把Container类型的对象设为内容面板。这取决于JFrame 类中的set***Pane(类型参数);方法中的”类型”是什么。对根面板其类型为JRootPane,对内容面板类型为Container 4、关于内容面板:除了默认的层面板附带有内容面板之外,你自已创建的层面板将不会拥有内容面板,这时你必须手

动为层面板设置一个内容面板(比如把JPanel设为内容面板),因为层面板是不可见且透明的,因此我们现在看到的将是根面板的内容,若你为根面板设置了背景色,则将显示该背景色。比如JLayeredPane jp=new JLayeredPane();

jframe.setLayeredPane(jp); 这时若使用jframe.getContentPane().add(jb); 语句,那么按钮jb将无法显示,因为该层面板中还没有内容面板存在,在添加组件之前应把某个容器设为内容面板,比如jframe.setContentPane(jpanel);这样程序就能正常运行了。

5、关于所有面板都设为不可见或透明时的问题:若除根面板外把其他所有面板都设为不可见或透明,则若根面板设为

透明,则会显示JFrame的面板,标题栏和边框。若根面板设为不可见,则我们只能看到一个框架,即只有标题栏,边框,看不见JFrame的面板。

6、关于层面板的透明问题:层面板都是透明的且不可见的,在层面板的各层之间他们始终是彼此透明的,无法更改,

我们也无法直接访问到层面板中的其他各层,因此层面板将只会有一种背景色(除内容面板外)且背景色使用

JLayeredPane类型的对象来设置,不会存在层面板的每一层都有各自的背景色的情况,层面板透明与不透明也只能由JLayeredPane的对象来设置,不能设置层面板中各个层次的透明性。

各层面板之间的可见性透明性及各种面板之间的关系示例:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class A {public static void main(String arg[])

{JFrame f=new JFrame(); JPanel jp1=new JPanel();

JButton jb1=new JButton("玻璃面板默认FlowLayout布局");

JButton jb2=new JButton("内容面板默认BorderLayout布局");

JButton jb3=new JButton("在内容面板之下的层面板");

JButton jb4=new JButton("根面板无默认布局");

JButton jb5=new JButton("在内容面板之上的层面板");

JButton jb6=new JButton("JFrame窗体");

//将JFrame所反回的面板都强制转换为JComponent类型,以便调用setOpaque方法。

JComponent p1=(JComponent)f.getGlassPane();

JComponent p2=(JComponent)f.getContentPane();

JComponent p3=(JComponent)f.getLayeredPane();

JComponent p4=(JComponent)f.getRootPane();

p1.setBackground(Color.red);

p2.setBackground(Color.yellow);

p3.setBackground(Color.blue);

p4.setBackground(Color.green);

p1.add(jb1);

p2.add(jb2,BorderLayout.SOUTH);

//为层面板p3添加两个按钮,且分别放置在内容面板之上和内容面板之下

p3.add(jb3,new Integer(-30001)); //将按钮jb3,放置在内容面板之下

p3.add(jb5,new Integer(22)); //将按钮jb5,放置在内容面板之上

jb5.setSize(200,22); jb5.setLocation(7,35);

jb3.setSize(200,22); jb3.setLocation(7,90);

//向根面板p4中添加一个按钮jb4

p4.add(jb4);

jb4.setSize(200,22); jb4.setLocation(7,60);

//f.add(jb6,BorderLayout.NORTH);//该方法实际上是把按钮jb5添加到了内容面板上,并未把jb5添加到窗体f上。

f.setLocation(222,222);

f.setSize(222,222); f.setVisible(true);

//循环显示各层面板

while(true){

//玻璃面板默认是不可见且透明的。显示玻璃面板红色背景。

try{Thread.sleep(2000); } catch (InterruptedException e) {}

p1.setVisible(true);

p1.setOpaque(true);

f.repaint(); //应使用repaint方法重缓一次,要不然会出现组件上次显示的残影

//使玻璃面板透明,但是是可见的,这样的话就会显示内容面板和层次数目在内容面板之上的层面板的内容。因为层面板自身层内之间是相互透明的,因此不会显示层面板的蓝色背景,相反内容面板是不透明的,因此会显示内容面板的背景颜色try{Thread.sleep(2000); } catch (InterruptedException e) {}

p1.setOpaque(false);

//p1.setVisible(false); //你也可以把该行的注释删除掉,以便观察可见性与透明性的区别。

f.repaint();

//使内容面板透明,因为前面已把玻璃面板设为透明,因此会显示全部的层面板的内容,包括层面板的蓝色背景

try{Thread.sleep(2000); } catch (InterruptedException e) {}

p2.setOpaque(false);

//p2.setVisible(false);

p3.setOpaque(true);

f.repaint();

//使层面板透明,因为内容面板是层面板中的某一层,因此该设置同样会使内容面板透明,再加上之前已把玻璃面板设为透明,因此最后将会显示即不透明也是可见的根面板的内容及其绿色的背景色。

try{Thread.sleep(2000); } catch (InterruptedException e) {}

p3.setOpaque(false);

//p3.setVisible(false);

f.repaint();

//使所有面板的可见性及透明性还原。

try {Thread .sleep (2000); } catch (InterruptedException e) {}

p1.setVisible(false );

p2.setOpaque(true );

p3.setOpaque(true );

f.repaint(); }}}

程序结果按如下顺序循环显示

1、最先显示

2、两秒之后

3、再2秒之后

4、再2秒之后

可以看到在内容面板之上的层中的组件被显示出来了,而在内容面板之下的层的组件被内容面板挡住了,而且最后显示的是内容面板的黄色前景,并未显示层面板的蓝色背景,因此对于层面板之间的各层是相互透明而可见的,层之间的透明性是不能更改的,但可以更改层面板与其他面板(比如根面板)之间的透明性

内容面板上的按钮组件, 内容面板的黄色背景

在层面板中层数大于内容面板的层上的按钮 在未设置可见性及透明性之前的初始效果------显示内容面板及层数在其上的层面板的内容 玻璃面板上的按钮 玻璃面板的红色背景 默认时玻璃面板是透明的且不可见的 但可以更改其可见性与透明性

把玻璃面板设为可见且不透明时的效果------显示玻璃面

把内容面板和玻璃面板都设为透明时的效果-----显示层面板背景色

层面板的蓝色背景 玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来 该层位于内容面板之下,因为把内容面板设置为透明的,因此该层的按钮就被显示出来了,而且层面板的背景色蓝色也显示出来了 因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来 把玻璃面板设为透明时的效果-----显示内容面板背景色 玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来 因为层面板彼此之间的各层是透明的,因此该按钮仍被显示出来

5、再2秒之后

玻璃面板被设为透明但可见的,因此玻璃面板之上的按钮仍然被显示出来

根面板之上的按钮

根面板的绿色背景

把层面板和玻璃面板都设为透明时的效果-----显示根面板背景色

第2部分:JRootPane类

对于根面板的内容,我们在前面已介绍过,这里我们来具体看一下JRootPane类的内容,该类只有一个默认的构造方法,但要注意,若你自已创建一个JRootPane对象,那些你应该对在根面板之上的层面板,玻璃面板和菜单栏的布局负责JRootPane类的内部类有:

JRootPane.RootLayout:该类自定义布局管理器负责层面板,玻璃面板和菜单栏的布局。

JRootPane类的常量有:

protected Container contentPane内容窗格(或面板)

protected JButton defaultButton当面板成为焦点并有类似按下Enter键的特定于UI的操作发生时被激活的按钮。protected Component glassPane玻璃窗格,便于截取鼠标移动等操作

protected JLayeredPane layeredPane管理菜单栏和内容窗格的分层窗格

protected JMenuBar menuBar菜单栏

以下的常量为static int类型,都是供windowDecorationStyle属性使用的常量

COLOR_CHOOSER_DIALOG 指示JRootPane应提供适合Dialog的装饰以便显示JColorChooser

ERROR_DIALOG 指示JRootPane应提供适合Dialog的装饰以便显示一条错误消息

FILE_CHOOSER_DIALOG 指示JRootPane应提供适合Dialog的装饰以便显示JFileChooser

FRAME 指示JRootPane应提供适合Frame的装饰

INFORMA TION_DIALOG 指示JRootPane应提供适合Dialog的装饰以便显示一条报告消息

NONE 指示JRootPane不应提供任何类型的Window装饰

PLAIN_DIALOG 指示JRootPane应提供适合Dialog的装饰

QUESTION_DIALOG 指示JRootPane应提供适合Dialog的装饰以便向用户显示一个问题

WARNING_DIALOG 指示JRootPane应提供适合Dialog的装饰以便显示一条警告消息

JRootPane的方法有:

protected Container createConentPane(); 由构造方法调用以创建默认的内容面板。注意该方法只能由构造方法调用。protected Component createGlassPane(); 由构造方法调用以创建默认的玻璃面板

protected JLayeredPane createLayeredPane(); 由构造方法调用以创建默认的层面板

protected LayoutManager createRootLayout(); 由构造方法调用以创建默认的布局管理。

void setContentPane(Container co); 设置内容窗格。

void setGlassPane(Component g); 设定此根窗格的玻璃窗格

void setJMenuBar(JMenuBar m); 设置在分层窗格中使用的菜单栏

void setLayeredPane(JLayeredPane jl); 设置供根窗格使用的分层窗格

Container getContentPane(); 反回内容窗格。

Component getGlassPane(); 反回此根窗格的当前玻璃窗格

JMenuBar getJMenuBar(); 反回窗格层的菜单栏

JLayeredPane getLayeredPane(); 反回根窗格使用的分层窗格

void setDefaultButton(JButton de); 设置defaultButton属性,它确定此JRootPane的当前默认按钮。

JButton getDefaultButton(); 反回defaultButton属性的值

void setUI(RootPaneUI ui); 设置呈现此组件的L&F对象

RootPaneUI getID(); 反回呈现此组件的L&F对象。

String getUIClassID(); 反回一个指定呈现此组件的L&F类名称的字符串。

void setWindowDecorationStyle(int w); 设置JRootPane应提供的Window装饰类型。

int getWindowDecorationSytle(); 反回JRootPane提供的Window装饰类型的常量。默认不提供任何Window

装饰(即外观)。其值为JRootPane类中定义的那些static int常量。

void setDoubleBuffered(boolean b); 设置此组件是否使用双缓冲技术

void updateUI(); 将UI属性重置为当前外观对应的值。

第3部分:JLayeredPane类(主要讲解组件相互重叠在一起的情况)

1、前面已介绍过,JLayperedPane层面板是分很多层的,因此,在JLayeredPane类中,为层面板的各层都赋于了一个编号,以区别正在使用的是哪一层,这个编号是一个Integer类型(把int类型装相就成为该类型)的整数,Integer实际上就是一个整数。编号数字越大的层位于编号数字更小的层的前面,也就是说当各层的子组件重叠时,高层的子组件将显示在低层中的子组件之上,即低层的子组件被高层的子组件遮挡住了。再次说明,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。

2、为了方便JLayeredPane类定义了一些深度不同的层,这些层由JLayeredPane类中的常量所标识他们是:DEFAULT_LAYER 默认层。该层是大多数组件位于的标准层,其值为Integer(0)

PALETTE_LAYER palette调色板层。位于默认层之上,它们对于浮动工具栏和调色板很有用,其值为Integer(100) MODAL_LAYER 该层用于模式对话框。它们将出现在容器中所有工具栏,调色板和标准组件之上,其值为Interger(200)

POPUP_LAYER 弹出层。组合框,工具提示和与帮助文本关联的弹出式窗口将出现在组件,调色板或生生成他们的对话框之上。其值为Interger(300)

DRAG_LAYER 拖动一个组件时,将该组件重分配到拖动层可确保将其定位在容器中的其他所有组件之上。完成拖动后,可将该组件重分配到其正常层。其值为Interger(400)

FRAME_CONTENT_LAYER 内容面板层,我们经常使用的内容面板层就位于该层上。其值为Interger(-30000)

下面我们主要讲解,添加的组件相互重叠明的问题:

index索引值:a、在java中,每向容器添加一个组件都会产生一个随带的索引值,即使组件在不同的层上也不影响索引值的产生,若在同一层的多个组件相重叠时,则索引值越大的组件将被放置在越后面。索引值0表示组件在最上层,而-1表示最底层。每添加一个组件程序都会自动为其设置索引值,最先添加的组件索引值为0,第二个添加的其值为1,第三个添加的则为2,以此类推。

b、当新添加进来的组件改变了原来的索引顺序时,则所有组件的索引将重新排列,比如组件1的索引为0,组件2的为1....组件5的为4,当把组件6添加到索引位置2时,这时的索引顺序是,组件1索引为0,组件2为1,组件6为2,组件3为3,组件4为4,组件5为5。因此索引值与组件的产生顺序有关,最先产生的组件索引值小,而后面产生的组件的索引值都比紧前一个组件的大1。

c、当在比当前层更低层的面板上产生新组件时,虽然系统产生的索引值的规律是一样的,但是这时你在更低层面板上改变组件的索引值时就有一个最小值的限制,这个最小值就是当前层的组件个数。比如当前层有4个组件,因此索引值最大为3,那么更低层组件的索引值的最小值就是4。在比当前层更高层的面板上产生新组件时,不受此限制。positon位置值:在同一层中,组件不但有一个索引值,而且组件所在的位置还有一个位置值,位置值与索引值的作用是相同的,产生的方式也是一样的,位置值与索引值的区别在于位置值只能在同一层中使用,而索引值是能跨层使用的,也就是说在不同的层中索引值是不相同的,而在不同的层中位置值有可能是相同的,比如在111层上有4个组件,那么这4个组件的索引值和位置值都分别是从0到3,这时在112层上又有3个组件,那么这两个组件的索引值可能是4到6(也有可能被你设置为0到2),而位置值则只能是0到2之间。

index索引值与position位置值的关系:索引值与位置值的功能和产生方式都是一样的,因此当你改变位置值或索引值时,索引值或位置值就会作相应的改变,当然索引值与位置值不一定是相等的,位置值取决与同一层中的组件数,而索引值则取决于所有层中的组件总数。

改变索引值的方法有add(),改变位置值的方法有setLayer()和setPosition(),moveToBack()和moveToFront()方法。

使用Container类中的void add(Component com, Object constrainer)方法。

该方法的作用是,把组件com添加到层面板中指定的层上。该方法的用法是,把Integer类型的对象指定为constrainer 参数,比如layeredPane.add(component, JLayeredPane.DEFAULT_LAYER);或者layeredPane.add(component, new Integer(10))。这里要注意的是第二个参数一定要是Integer类型的,不可以使用int类型,若使用int类型,则不会出错,因为在Container类中还有一个add方法,其形式为add(Component com, int index); 表示将组件添加到指定的索引处。使用Container类中的void add(Component com, Object constrainer, int index)方法

该方法与上面带两个参数的add方法相似,不同的是该方法将组件com添加到layerPane中指定层上的指定索引处。比如layeredPane.add(com, new Integer(10), 3); 表示将组件添加到层面板编号为10的那一层上,其位置在该层索引为3的地方。注意,这里使用的是索引值,而不是位置值,注意他们的区别。

setLayer()方法:使用该方法应注意的地方是,当使用该方法时只是把组件设置在层面板中的哪一层中出现,程序并没有把该组件添加到该层中,在使用setLayer方法后还应使用add方法把组件添加进层面板的这一层中,而且add方法应出现在setLayer方法之后。比如layerPane.setLayer(component, 3); layerPane.add(component);

该方法有2个变体,分别是:

void setLayer(Component c, int layer); 将组件c放在编号为layer的层上,并把它放置在该层的最底部。void setLayer(Component c, int layer, int position); 将组件c放在编号为layer的层上,且把它放置在该层指定的位置值处

(注意,这个方法的第3个参数是否不起作用,我在程序中试过好多次) void setPosition(Component c, int position); 将组件c放置在当前层的position位置值(注意不是索引值)处,其中0表

示放置在该层的最顶层,数值-1放置在最底层。对于其他数字,数字越

大则放置在越后面。

JLayeredPane使用技巧:使用JLayeredPane类设置多层面板时应先创建一个JLayeredPane类的对象,再使用setLayeredPane方法把该对象设为窗体的层面板,这时就可以使用该对象调用JLayeredPane类中的相应方法,若使用JFrame类中的getLayeredPane方法,则不能使用JLayeredPane类中的方法,因为getLayeredPane方法反回的对象是Component对象,该对象无法调用JLayeredPane类中的方法

有了前面的知识,那么下面我们就来看看JLayeredPane类中的具体内容

JLayeredPane类中的常量有(都为static Integer类型):

DEFAULT_LAYER 默认层。该层是大多数组件位于的标准层,其值为Integer(0)

PALETTE_LAYER palette调色板层。位于默认层之上,它们对于浮动工具栏和调色板很有用,其值为Integer(100) MODAL_LAYER 该层用于模式对话框。它们将出现在容器中所有工具栏,调色板和标准组件之上,其值为Interger(200)

POPUP_LAYER 弹出层。组合框,工具提示和与帮助文本关联的弹出式窗口将出现在组件,调色板或生生成他们的对话框之上。其值为Interger(300)

DRAG_LAYER 拖动一个组件时,将该组件重分配到拖动层可确保将其定位在容器中的其他所有组件之上。完成拖动后,可将该组件重分配到其正常层。其值为Interger(400)

FRAME_CONTENT_LAYER 内容面板层,我们经常使用的内容面板层就位于该层上。其值为Interger(-30000)

static String LAYER_PROPERTY 绑定属性。

JLayeredPane类有一个默认的构造方法

JLayeredPane类中的方法有:

Component [ ] getComponentsInLayer(int layer); 反回指定层中组件的数组

int getComponentCountInLayer(int layer); 反回指定层中组件的个数

int getIndexOf(Component c); 反回指定组件的索引值

int getLayer(Component c); 反回指定组件所在层的int值(即组件在第几层)

static int getLayer(JComponent c); 反回指定的JComponent组件在第几层。

int highestLayer(); 反回当前层面板中所拥有的子层中最顶层的层的值。

int lowestLayer(); 反回当前层面板中所拥有的子层中最底层的层的值。

boolean isOptimizedDrawingEnabled(); 判断组件是否可以重叠,若可以则反回false,否则反回true

void moveToBack(Component c); 将组件c移动到当前层中所有组件的最底层(位置-1处),只能改变位置值void moveToFront(Component c); 将组件c移动到当前层中所有组件的最顶层(位置0处),只能改变位置值void paint(Graphics g); 绘制此JLayeredPane

static void putLayer(JComponent c, int layer); 该方法与setLayer方法类似,只是不会产生一些副作用,比如重绘,而

且只适用于JComponent组件。

void remove(int index); 从此窗格中移除索引为index的组件

void removeAll(); 从此容器中移除所有组件。

void setLayer(Component c, int layer); 将组件c放在编号为layer的层上,并把它放置在该层的最底部。void setLayer(Component c, int layer, int position); 将组件c放在编号为layer的层上,且把它放置在该层指定的位置值处

(注意,这个方法的第3个参数是否不起作用,我在程序中试过好多次) void setPosition(Component c, int position); 将组件c放置在当前层的position位置值(注意位置值与索引值的区别)处,

其中0表示放置在该层的最顶层,数值-1放置在最底层。对于其他数字,

数字越大则放置在越后面。

int getPosition(Component c); 反回组件c所在层的位置值,注意位置值与索引值的区别。JLayeredPane层面板示例:

在该示例中,我们可以看到位置值与索引值的区别,以及怎样使用多个层。具体情况请自行运行试验。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class A { public static void main(String arg[])

{JFrame f=new JFrame();

JLayeredPane p=new JLayeredPane();//要使用JLayeredPane类中的函数,应创建一个JLayeredPane的对象。//Component p=f.getLayeredPane(); //或使用该方法则无法使用JLayeredPane类中的各种函数,因为该方法反回的结果是Component类型的,该类型是JLayeredPane的父类,父类不能使用子类中的方法,除非强制转换。

JButton jb1=new JButton("kkk1"); JButton jb2=new JButton("kkk2");

JButton jb3=new JButton("kkk3"); JButton jb4=new JButton("kkk4");

JButton jb5=new JButton("kkk5"); JButton jb6=new JButton("kkk6");

f.setLayeredPane(p); //将JLayeredPane对象p设置为窗口f的层面板。

//布置按钮jb1

p.add(jb1,new Integer(111)); //使用add方法把按钮jb1添加到层面板的111层,层面板中的每一层其实就是

一个容器,因此可以直接向层面板中添加组件。

jb1.setSize(88,44); //因为层面板没有布局管理器,所以应对按钮组件的大小和位置进行设置,这里的位置使用

的是默认值左上角。若不设置按钮的大小,我们最后将看不到按钮。

int ps1=p.getPosition(jb1);

System.out.println("ps1="+ps1); //这里输出的是当前的位置值,当后面添加了新组件并设置了位置值时,该

值有可能会变化。

jb1.setVisible(true);

//布置按钮jb2

p.add(jb2,new Integer(111),0); //使用add方法把按钮jb2添加到层面板的111层,并使其显示在相同层的最

顶层,注意这里的0是一个索引值,而不是位置值,注意索引值与位置值

position的区别

jb2.setSize(88,44);

int ps2=p.getPosition(jb2);

System.out.println("ps2="+ps2);

jb2.setVisible(true);

//布置按钮jb3

p.setLayer(jb3,111); //使用setLayer方法将jb3按钮添加到层面板的111层,并将该组件放置在同层的最底层。 p.add(jb3);//注意该add方法,在使用setLayer方法之后一定要使用add方法,要不然组件将不能添加到层面板中 jb3.setSize(88,44);

p.setPosition(jb3, 2); //使用setPosition方法将jb3放置在索引为2的位置。

int ps3=p.getPosition(jb3);

System.out.println("ps3="+ps3);

jb3.setVisible(true);

//布置按钮jb4

p.setLayer(jb4,111,0); //使用setLayer方法将jb4放置在层面板的111层,并使其显示在同层的最顶层上,

该方法的最后一个参数无效,至于为什么,有待考证。

p.add(jb4);

jb4.setSize(88,44);

int ps4=p.getPosition(jb4);

System.out.println("ps4="+ps4);

jb4.setVisible(true);

//布置按钮jb5

p.add(jb5,110,0); //将jb5的索引值在110层上设为0,而这实际上是不可行的,因为110层比前面使用的111

层更低,这一层的索引值的最小值受到紧前层的组件个数的限制,因此对于在这一层上产

生的组件的索引值的最小值是111层的组件个数4。

jb5.setSize(88,44);

jb5.setLocation(88,44); //设置jb5的位置,注意,层面板是没有布局管理器的,对于组件的位置和大小都应

进行手工设置。

int ps5=p.getPosition(jb5); //反回jb5的位置值

int ind=p.getIndexOf(jb5); //反回jb5的索引值

System.out.println("ps5="+ps5);

System.out.println("index5="+ind);//这里可以看到索引值与位置值是不相同的,而且该层的索引值最小值为4。 jb5.setVisible(true);

//布置按钮jb6

p.add(jb6,110,1);

jb6.setSize(88,44);

jb6.setLocation(88,44);

int ps6=p.getPosition(jb6);

int ind1=p.getIndexOf(jb6);

System.out.println("ps6="+ps6);

System.out.println("index6="+ind1);

jb6.setVisible(true);

//改变111层组件的位置值。

p.moveToFront(jb3);

p.moveToBack(jb1);

//下面的程序将显示在111层上组件的最终位置值,请仔细观察各位置值是怎样变化的。

int a=p.getPosition(jb1); int b=p.getPosition(jb2);

int c=p.getPosition(jb3); int d=p.getPosition(jb4);

System.out.println("a="+a+" "+"b="+b+" "+"c="+c+" "+"d="+d);

f.setSize(222,222); f.setVisible(true);}}

运行结果

java swing 组件大全

import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.tree.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.table.*; /** * Swing 组件测试程序 * 测试Swing所有组件及其相应的事件 * @author 天翼.李 2003.4.17 晚23:14 * @link https://www.doczj.com/doc/8612987027.html, * @link robococde@https://www.doczj.com/doc/8612987027.html, */ public class SwingT est extends JFrame { /** * 主模块,初始化所有子模块,并设置主框架的相关属性 */ public SwingTest() { // 初始化所有模块 MenuTest menuTest = new MenuTest(); LeftPanel leftPanel = new LeftPanel(); RightPanel rightPanel = new RightPanel(); BottomPanel bottomPanel = new BottomPanel(); CenterPanel centerPanel = new CenterPanel(); // 设置主框架的布局 Container c = this.getContentPane(); // c.setLayout(new BorderLayout()) this.setJMenuBar(menuTest); c.add(leftPanel,BorderLayout.WEST); c.add(rightPanel,BorderLayout.EAST); c.add(centerPanel,BorderLayout.CENTER); c.add(bottomPanel,BorderLayout.SOUTH); // 利用无名内隐类,增加窗口事件 this.addWindowListener(new WindowAdapter() { public void WindowClosing(WindowEvent e)

AWT和Swing的概述

AWT和Swing的概述 Java基本类 Java基本类(JFC),由一些软件包组成。这些软件包主要包括下面一些应用程序接口(API): ?抽象窗口工具集(AWT)(1.1及以上版本)。 ?Swing构件。 ?Java2D应用程序接口(2D API)。 ?兼容程序接口。 上面列出的这些应用程序接口可能会出现在多个软件包中。例如:2D API在Java.awt 和Java.awt.image软件包中都存在,虽然像Java.awt.geom等一些特殊的软件包也支持2D API,但是大量的2D API类都存在于Java.awt软件包中。 AWT(1.1及以上版本)是JFC的核心。AWT为JFC的构成提供了以下的基本结构: ?代理事件模型。 ?轻量构件。 ?剪贴板和数据传输。 ?打印和无鼠标操作。 抽象窗口工具集 在开发applet和图形应用程序时,一般需要用到AWT,AWT是免费Java开发工具包(JDK)的一部分。AWT的作用是给用户提供基本的界面构件,例如按钮、列表、菜单、文本域等等。AMT 构件主要是用来建立图形用户界面的独立平台。此外,AWT还提供事件处理结构、支持剪贴板、数据传输和图像操作。随着2D API的出现,AWT还包括提供高级字体操作、打印、地理数据获取和输入方法等功能的软件包。AWT的初始版本是基于在简单用户界面中开发小applet程序而设计的,与之相比,当前的AWT做了很大的改进,它提供事件模型重新设计、剪贴板和数据传输支持以及打印和无鼠标操作等功能。从而与Parc Place的VisualWork或Borland公司的Object Windows Library(OWL)等企业级用户界面具有更多的可比性。 同位体和平台独立 随着Applet程序和图形应用程序接口的发展,AWT提供了一系列的通用类,这些通用类在引用时不需要考虑特定的窗口平台,同位体(Peer)就属于这种AWT类集。同位体是一种本地图形用户接口(GUI)构件,由AWT类管理。同位体的工作方法和它们对程序开发的影响常 常让人混淆。

(总结)Swing组件的使用

(总结)Swing组件的使用 Swing 的组件与AWT 组件相似,但又为每一个组件增添了新的方法,并提供了更多的高级组件.Swing 的基本组件:1.按钮(JButton): Swing 中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且还可以将多个图像指定给一个按钮。 (1).JButton 常用的构造方法。 JButton(String text):按钮上显示字符。 JButton(Icon icon) :按钮上显示图标。 JButton(String text, Icon icon):按钮上既显示图标又显示字符。 (2).常用方法: b1.setEnabled(false); //使按钮当前不可用 b1.setToolTipText("..."): //设置按钮提示文本 b1.setMnemonic(KeyEvent.VK_D);// 将b1邦定alt+D键(3).案例代码: [java] view plain copy print?public class JButtonExample3 extends JPanel implements ActionListener { protected JButton b1, b2, b3; public JButtonExample3() { ImageIcon

leftButtonIcon = createImageIcon("right.gif"); ImageIcon middleButtonIcon = createImageIcon("middle.gif"); ImageIcon rightButtonIcon = createImageIcon("left.gif"); b1 = new JButton("失效中间按钮(D)", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER);// 水平中间对齐 b1.setHorizontalTextPosition(AbstractButton.LEADING);// 相当于LEFT b1.setMnemonic(KeyEvent.VK_D);// 将b1邦定alt+D键b1.setActionCommand("disable"); b2 = new JButton("M中间按钮", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M);// 将b2邦定alt+M键b3 = new JButton("E激活中间按钮", rightButtonIcon); b3.setMnemonic(KeyEvent.VK_E);// 将b3邦定alt+E键 b3.setActionCommand("enable"); b3.setEnabled(false); // 给1和3添加事件监听b1.addActionListener(this); b3.addActionListener(this); // 设置按钮提示文本b1.setToolTipText("点击这个按钮,

Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)

主要参考文现: [美]Herbert Schildt 著 鄢爱兰 鹿江春译 《java 参考大全 J2SE 》 清华大学出版社 2006年1月 孙卫琴 《Java 面向对象编程》 出版社及日期不详 java API 开发人员文档 本文作者:黄邦勇帅 本文的说明:本文主要讲解了对大学初学Swing 时对根面板JRootPane ,内容面板containPane ,层面板JLayeredPane ,玻璃面板glassPnae 的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。 Swing 组件的各种面板(JRootPane 根面板,JLayeredPane 层面板等) 第一部分:JFrame 中各面板间的关系,透明性与可见性问题 注:在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。注意窗格与窗体是不一样的。 在Swing 中的JFrame 窗体与AWT 中的Frame 窗体有一些不同。JFrame 由他的窗体本身加上其上的JRootPane 根面板,JLayeredPane 层面板,containPane 内容面板,glassPane 玻璃面板,JMenuBar 菜单栏(可选,不包括在内)四部分组成。其中根面板在JRootPane 类中实现,层面板在JLayeredPane 类中实现,他们都是JComponent 的子类。而containPane 和glassPane 没有专门对应的类。 1、各种面板(或称窗格)的关系及作用: JRootPane 根面板:该面板是在JFrame 窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame 窗体等。 JLayeredPane 层面板:该面板是其他所有面板的父级,在JRootPane 面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar 菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane 面板的顶部,剩下的部分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层,在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理各种内部窗体的叠放问题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。 containPane 内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一个JPane 对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT 那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb 则正确的方式为,Container p=jframe.getContentPane(); p.add(jr); 或jframe.getContentPane().add(jr); 其中getContentPane()是JFrame 类中的方法,该方法将反回内容面板的引用,这是访问默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。 glassPane 玻璃面板:该面板总是存在的,而且他位于最上面,默认情况下玻璃面板是不可见的,玻璃面板用于接收鼠标事件和在其他组件上绘图。 2、各面板中使用的布局管理器: 在内容面板上使用的布局管理器默认是BorderLayout 。 在根面板上使用的布局管理器是一个自定义的LayoutManager(布局管理器),他的作用是布局根面板之上的其他面板。很明显如果你要向根面板中添加组件就应使用setLayout 方法为其设置合适的布局管理器或自已设定组件的大小和显示

Swing组件大全

一抛砖引玉 本文指在利用一个小程序”Swing 组件大全”来引导大家学习Java这门语言,熟悉Ja va Swing的各个组件。并在学习过程中参考作者设计这一程序的方法和思想,最终形成自己的思维方式和学习方式。你能举一返三是作者最开心的事情。小程序演示了Java Swing 大部分组件。最后附上了全部代码及详细的注释说明。希望本文能对大家学习Java有所帮助。 随着Java风潮席卷国内,学习Java的方法和路径越来越多。而在大量的书本前,在J ava庞大的类库前大大家都有点迷失方向的感觉,是学J2EE,J2ME还是。。。。。。然而所有的这些都或多或少的离不开J2SE。万丈高楼平地起。J2SE是整个Java的基础,学好了这个对Java的各个方向都是很有利的。而学习J2SE的最初点就在界面设计,因为界面编程是你来感觉最直接的手段,是提高大家编程兴趣的很好开始,因为你写完程序编译后可马上看到自己的成果。而不像后台编程做完了都感受不到效果。而好的界面也是你测试你其他程序的基础。 界面设计!不就是拖拉操作吗?如果是VB,VC等可视化的编程,的确只是一些拖拉操作,由于Java语言的设计中所有的东西都是程序代码,在Java中如果想要设计一个好的界面,可不是简单的拖拉操作能完成的。即使使用了如JBuilder这么强大的可视化工具,你也得亲自动手写一些界面设计代码才能很好的完成你的任务。如果你能在此基础上理解Java界面设计的思想,对你学习这门语言将有莫大的帮助。 Java界面设计主要涉及Awt,Swing两大类库,Swing是Awt的扩展和功能加强。下面我们就以Swing为基础来说说整个Java的界面设计。 二感受效果 在开始之前,让我们看看这篇文章要达到的效果,有了目标和成果才有学习的兴趣,起码我是这样认为和学习的。如下图所示,这就是我们设计的界面,它包括了Swing中大部分

JFrame中各面板的层次结构

在Swing中,我们有三种可以使用的顶层容器类,它们分别是: JFrame:用来设计类似于Windows系统中的窗口形式的应用程序。JDialog:和JFrame类似,只不过JDialog是用来设计对话框。JApplet:用来设计可以在嵌入在网页中的Java小程序 后来加入了JWindow组成四大顶层容器 下面讲解四大顶层容器之一JFrame中各面板的层次结构:

可以看出, Frame 的最底层是 RootPane, 然后是 LayeredPane 再上面就是 ContentPane 最顶层是 GlassPane(透明的) 现在我们再来看另一张图,从模型的角度来看 JFrame 的层次:

可以看出,其实 ContentPane 是添加在 LayeredPane 上的一个控件。 而 LayeredPane 和 GlassPane 是直接添加在 RootPane 上的, RootPane 直接添加在 JFrame 上。 在Swing中的JFrame窗体与AWT中的Frame窗体有一些不同。JFrame由他的窗体本身加上JRootPane根面板,JLayeredPane层面板,containPane内容面板,glassPane玻璃面板,JMenuBar菜单栏(可选,不包括在内)四部分组成。其中根面板在

JRootPane类中实现,层面板在JLayeredPane类中实现,他们都是JComponent的子类。而containPane和glassPane没有专门对应的类。 JRootPane:根面板,在建立JFrame时就默认加进来了,覆盖除边框之外的整个表面,其余面板均在它之上,由它管理,默认可见不透明。Swing中的三种顶层容器(JFrame、JDialog、JApplet)都依赖于根面板. 你通常不需要了解关于使用Swing组件根面板方面的知识. JLayeredPane:建立在JRootPane(根面板)上,其上有菜单面板JMenuBar和内容面板containPane。对于层面板上的多层,只能把某种容器(比如JPanel)设置为内容面板层,层面板中的其他层都不能设置。使层面板可见用setOpaque()。 contentPane:内容面板,向窗体中添加的所有组件都是添加到contentPane中的,如果组件未添加到此层,就不会显示了。其中getContentPane是返回内容面板的引用,默认可见不透明,我们看到的就是内容面板的内容。向层面板添加组件要添加在contentPane这一层。 glassPane:该面板位于最上层,默认透明不可见。若将某一容器(比如JPanel)设为玻璃面板,它仍是不可见的,但它不是透明的,这取决于该容器是否是透明的。 今天说我们的重点:ContentPane 可以看出,这个 ContentPane 就是默认盛放控件的那个层次, 那 ContentPane 在默认的情况下又是什么呢? 我们来看两个方法: JFrame 中的 getContentPane: public Container getContentPane() { return getRootPane().getContentPane();

swing组件总结认识

JFrame是主窗口,它和JDialog,JApplet的地位并列。但是,一个JFrame可以添加JDialog和JApplet进去它的内容面板,而反过来就不行。 2、JLabel JLabel是一标签,在它的文本里嵌入html标签,可以简单实现一个超链接组件 3、JTextField 一个文本框 4、JTextArea 文本区域,与文本框不同的是它是多行的 5、JPasswordField 6、JPanel 一个面板.一般用作控制组件的布局. 7、JCheckBox 复选框 8、JRadioButton 单选按钮.单选按钮要用到ButtonGroup.添加到同一个ButtonGroup的单选按钮表示在它们之间只可选其一.不同ButtonGroup里的单选按钮相互之间的选择不受影响. 9、JScrollPane JScrollPane由四个角,两个头部,和一个视口组成.四个角和两个头部都是由Component组成.四个角并不是总是显示出来的.左上角只有当两个头部同时存在才显示,右下角只有两个滚动条同时出现才会出现.其他两个角可同理知道什么时候会出现.视口是显示内容的部分,由JViewport对象表示.而真正显示的内容,由JV iewport的view表示 10、JList JList是一个列表.这里将首次引入Model这个概念,中文翻译是模型,不好理解,其实就是数据的意思.JList用ListModel保存它的数据.简单应用可以用实现了ListModel的AbstraceListModel的子类DefaultListModel来保存它的数据(尽管它的名字有Default,但是只有你使用了它创建JList,它才存在.即如果你没有用DefaultListModel创建JList,则你用getModel()返回的ListModel不能强制转换为DefaultListModel). 11、JComboBox 组合框和JList很相似,它们都是用ListModel来保存数据.默认它是使用实现了ListModel的子接口ComboBoxModel的DefaultComboBoxModel来保存数据的.与JList的情况不同,一个JComboBox总是有一个Model来保存数据的,而JList则不然. 12、JFileChooser JFileChooser代表一个打开/保存文件对话框 13、JColorChooser 一个颜色选择器.它的构造方法有: JColorChooser(),JColorChooser(Color initialColor),JColorChooser(ColorSelectionModel model) 创建了对象以后,可以调用将它添加到JFrame,JPanel等其他容器里面. 14、JSlider JSlider是一个滑动条.其实它还是比较容易使用的 15、JLayeredPane JFrame,JApplet,JDialog,JInternalFrame其实是由好几部分组成的 16、JInternalFrame JFrame不能添加JFrame到自已的内容面板.那么,如何实现多文档程序呢?用JInternalFrame

JAVA开发所有框架简介

Struts2 Struts2是一个web应用框架。它不是一个Struts的新的发布版本,而是一个全新的框架。Struts2 是第二代基于Model-View-Controller (MVC)模型的web应用框架。Struts2是java企业级web应用的可扩展性的框架。它是WebWork和Struts社区合并后的产物。这一版本的Struts2声称,Struts2会接近于原先版本Struts,并且会更容易使用。Struts2没有继承struts 1的血统,而是继承了webwork 的血统。 Struts2 和Struts的构建是社区开发模式的最好实践和证明。事实上,第一版本的Struts设计的第一目标就是使MVC模式应用于web程序设计。在过去10年,Struts在更好的web应用方面所做的工作是值得肯定的。在某些方面,Struts社区注意到这一框架的局限性,但在这个活跃的社区里,自动识别弱点和顽强不屈的精神,使得克服这些弱点是不困难的。在深入学习MVC运行模式并同时引入一些新的建筑学方面的设计理念后,新的Struts2框架结构更清晰,使用更灵活方便。这一新的结构包含应用逻辑的横切面拦截器,基于注释的配置以减少和去除XML形式的配置文件,功能强大的表达式语言,支持可更改、可重用UI组件的基于微MVC的标签库。Struts2 有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API 揭示了Java Servlet只是Java API 的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java 语言进行程序设计。 Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts 能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。【StrutsIDE:用于Struts辅助开发的一个Eclipse插件】 EasyJWeb EasyJ Web是基于java技术,应用于WEB应用程序快速开发的MVC框架,框架设计构思来源于国内众多项目实践,框架充分借签了当前主要流行的开源Web框架(Struts、JSF、Tapestry 、Webwork),吸取了其优点及精华,利用Velocity作为模板页面引擎,是一个实现了页面及代码完全分离的MVC开发框架。是一个能实现中小型Web应用系统快速开发的简易Web框架。 通过EasyJWeb Tools提供的配套开发工具,可以实现基于EasyJWeb框架的Web应用快速开发,包括常用应用软件的代码自生成、数据库添删改查(CRUD)代码生成、自动页面模版生成、配置文件管理等。 框架特点: 1、零配文件置支持。以前我们每接触一个框架,开始总都要被他的配置文件折腾一番。EasyJWeb 实现零配置支持,可以不写一句配置文件就在框架基础上构建你的运用。(适合小型网站系统)。 2、简易的模板页面设计支持:放弃使用jsp,使用简单Velocity脚本语言作为页面模板。 3、页面程序完全分离:实现显示页面与程序逻辑的完全分离,克服了传统jsp页面难于维护的问题。

swing 组件和容器——java swing 组件技术(中)

swing 组价和容器——java swing 组件和技术(中) 一、swing组件和容器概览 1.顶层容器(JFrame,JDialog,JApplet) JFrame—框架,主要用来设计应用程序的图像界面 JDialog—对话框,通常用来设计具有依赖关系的窗口 JApplet—小应用程序,主要用来设计嵌入网页中运行的java程序2.一般容器 普通容器(JPanel、JScrollPane、JToolbar、JSplitPane、JTabbedPane) JPanel—面板,通常只有背景颜色的普通容器 JScrollPane—滚动窗格,具有滚动条 JToolbar—工具条,通常将多个组件排成一排或者一列 JSplitPane—分裂窗格,用来装两个组件的容器 JTabbedPane—选项卡窗格,允许多个组件共享相同的界面空间

专用容器(JLayeredPane、JRootPane 、JInternalFrame) JLayeredPane—分层窗格,给窗格增加了深度的概念 JRootPane—根窗格,一般是自动创建的容器 JInternalFrame—内部窗格,可以在一个窗口内显示若干个类似于框架的窗口 3.基本控件(JButton、JCombobox、JList、JMenu、JSlider、JTextField) 4.不可编辑信息组件(JLabel、JProgressBar、JToolTip等) 5.可编辑组件(JColorChooser、JFileChooser、Jtabel、JTextArea、JTree等) 二、常用的swing组件和容器 1.JFrame ?顶层容器,默认不可见;默认布局方式为BorderLayout ?构造函数: ●JFrame() ●JFrame(String title)//title 为框架的标题内容 ?JFrame常用方法 ●setDefaultCloseOperation(int operation)—设置关闭框架的行为 参数operation一般是JFrame. EXIT_ON_CLOSE,表示关闭框架时, 则退出程序 ●setSize(int width, int height)—设置框架的大小 ●setVisible(boolean b)—设置框架是否可见,默认为false ●getContentPane()—获取顶层容器的内容面板

第8章_Swing组件[1]

第8章Swing组件 在第7章中,介绍了用AWT创建图形用户界面的基本原理。在java.awt包中,提供了各种具体的组件,如Frame、Panel、Button、Label等。AWT组件的优点是简单、稳定,同时兼容于任何JDK版本,缺点是依赖于本地操作系统的GUI,缺乏平台的独立性。为了实现跨平台,使得用java创建的图形界面在不同操作系统中保持相同的外观,从JKD1.2版本开始引入了Swing组件,这些组件位于javax.swing包中, Swing GUI组件定义了相对于java.awt 包更多、更强的功能,可以使用户更加灵活方便的进行GUI的设计。 Swing组件时用纯Java语言编写的,不依赖于本地操作系统的GUI,Swing组件可以跨平台运行。独立于本地平台的Swing组件被称为轻量级组件,而依赖于本地平台的AWT组件被称为重量级组件。 多数Swing组件的父类为javax.swing.JComponent,JComponent 的直接父类为java.awt.Container,与AWT中的Window与Panel处于同一个继承类层次。多数Swing组件类都是以大写字母“J”开头,图8-1显示了Swing组件的类层次结构。从图中可以看出,除JFrame外,其余的Swing组件都继承自JComponent类。 图8-1 Swing组件的类层次结构

8.1 容器组件 8.1.1 JFrame JFrame是用来替代AWT包中Frame的,可以实现与Frame相同的功能,包括作为容器容纳其他组件,显示组件等。 [例8-1] import javax.swing.*; import java.awt.*; class JFrameTest extends JFrame{ private JButton button1 = new JButton("button1"); private JButton button2 = new JButton("button2"); public JFrameTest(String title){ super(title);//设置标题 this.setBounds(50,50,200,150); //获得与JFrame关联的contentPane,contentPane默认的布局管理器是BorderLayout Container contentPane = this.getContentPane(); contentPane.setLayout(new FlowLayout(5)); contentPane.add(button1); contentPane.add(button2); this.setVisible(true); //设置JFrame对关闭按钮的处理方式 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } public class Test8_1 { public static void main(String[] args) { new JFrameTest("JFrame测试"); } } 程序运行界面如下: 图8-2 例8-1运行界面 利用JFrame实现了与Frame相同的功能,但JFrame与Frame在使用上还是有很大区别的。

Swing Architecture Overview 架构概述

Article A Swing Architecture Overview S wing架构概述 The Inside Story on JFC Component Design JFC组件设计探究 By Amy Fowler 作者:Amy Fowler 中文翻译:Azure Most Swing developers know by now that Swing components have a separable model-and-view design.And many Swing users have run across articles saying that Swing is based on something called a"modified MVC(model-view-controller)architecture." 大多swing开发人员现在都知道swing的组件采用的是模型-与-视图分离的设计,也有大量的swing使用者撰文陈述swing是基于“改良的MVC(模型-视图-控制者)结构”。 But accurate explanations of how Swing components are designed,and how their parts all fit together,have been hard to come by--until now. 但是在此之前对于swing组件是怎么设计的,它们的各部分是如何组合到一块的都描述的不是很准确。 The silence ends with the publication of this article,a major white paper on Swing component design.It provides a comprehensive technical overview of Swing's modified MVC structure and demystifies many other facets of Swing component architecture as well. 直到这篇swing组件设计白皮书文章的发表之后才让事情真相大白。本文对swing的改良的MVC架构做了一个很全面的技术概述,同时也对很多关于swing组件架构的其它方面的技术也做了概述。 This document presents a technical overview of the Swing component architecture.In particular,it covers the following areas in detail: 这篇文档对swing组件的架构做一个技术概论。详细来说,它具体包括以下几个领域: ●Design goals ●Roots in MVC ●Separable model architecture ●Pluggable look-and-feel architecture

Swing组件详解

swing布局详解(附示例图) 当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理。JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout。 下面将分别介绍几种最常用的布局管理器:FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout和GridBagLayout。 代码演示 每一个布局管理器都会有一个代码演示,xxxLayoutDemo.java(见附件)。这些文件主要有三个方法组成: addComponentsToPane()提供布局逻辑(依据不同的布局管理器和UI内容)。 FlowLayout FlowLayout类是最简单的布局管理器。它按照和页面上排列单词的类似方式来安排组件----从左到右,直至没有多余的空间,然后转到下一行。 效果:

内容面板代码: BorderLayout 一个BorderLayout对象将界面分成五大区域,分别用BorderLayout类的静态常量指定:-PAGE_START -PAGE_END -LINE_START -LINE_END -CENTER 效果: 内容面板代码:

BoxLayout BoxLayout可以将组件由上至下或由左至右依次加入当前面板。效果: 内容面板代码:

CardLayout 卡片布局和其他布局不同,因为它隐藏了一些组件。卡片布局就是一组容器或者组件,它们一次仅仅显是一个,组中的每个容器称为卡片。 效果: 内容面板代码:

GridLayout GridLayout让你建立一个组件表格,并且当组件加入时,会依序又左至右,由上至下填充到每个格子,它不能由你指定想放那个格子就放那个格子 效果: 内容面板代码: GridBagLayout GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的。GridBagLayout 同GridLayout一样,在容器中以网格形式来管理组件。但GridBagLayout功能要来得强大得多。 1、GridBagLayout管理的所有行和列都可以是大小不同的; 2、GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样:组件在容器中可以占据任意大小的矩形区域。 GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints。其中有11个公有成员变量,GridBagConstraints可以从这11个方面来进行控制和操纵。这些内容是: 1、gridx—组件的横向坐标; 2、girdy—组件的纵向坐标; 3、gridwidth—组件的横向宽度,也就是指组件占用的列数; 4、gridheight—组件的纵向长度,也就是指组件占用的行数;

java Swing中各种组件的综合应用

import java.awt.*; import javax.swing.*; import java.awt.event.*; class jmenuframe extends JFrame implements ActionListener{ JMenuBar menubar; JMenu m1; JMenu m11; JMenuItem m111; JMenuItem m112; JMenu m2; JMenu m21; JMenu m211; JMenu m212; JMenu m213; JMenuItem num1; JMenuItem name1; JMenuItem num2; JMenuItem name2; JMenuItem num3; JMenuItem name3; public jmenuframe(){ setSize(800,700); setTitle("登陆主界面"); Container c=getContentPane(); c.setBackground(Color.green); Label la=new Label("欢迎你,青青!您已进入主界面,可以进行相关操作了"); la.setBounds(100,300,600,30); la.setFont(new Font("宋体",Font.ITALIC,25)); la.setForeground(Color.blue); add(la); menubar=new JMenuBar(); menubar.setBackground(Color.pink); m1=new JMenu("学生信息管理"); m1.setForeground(Color.red); m1.setFont(new Font("楷体",Font.BOLD,25)); m2=new JMenu("学生成绩管理"); m2.setForeground(Color.magenta); m2.setFont(new Font("楷体",Font.BOLD,25)); m11=new JMenu("学生查询");

swing基本组件说明

第33章容器,布局管理器,边框 33.1 容器是用来存放而组织组建的对象 布局管理器是用来在容器中摆放组件的特殊对象 33.2 Swing容器的结构 不是直接显示用户界面组件,而是将组建放置到容器中,容器会显示它所包含的组件。所有容器的父类都是java.awt.Container,它是https://www.doczj.com/doc/8612987027.html,ponent的子类。 Container类具有以下功能 1.可以使用各种add和remove方法来添加和删除组件 2.拥有layout属性,用于指定在容器中放置组件的布局管理器,每个容器都有一个默 认的布局管理器 3.提供java.awt.event.ContainerEvent事件的注册方法

Jframe,JApplet,JDialog集成其对应的中性组件的所有功能,但具有较为复杂的内部结构,包含了多层窗格。 javax.swing.JRootPane是一个轻型容器,供Swing顶级容器在后台使用 javax.swing.JLayeredPane是一个用于管理可选菜单栏和内容窗格的容器 内容窗格是Container类的一个实例。默认状态下,他是一个具有布局管理器BorderLayout的JPanel对象 JPanel是一个可以添加用户界面的的容器。 要想获取JFrame或JApplet中的内容窗格,可以使用getContentPane()方法。如果性要把Container的一个实例设置为新的内容窗格,可以使用setContentPane()方法 玻璃窗格浮在最上面。默认情况下,javax.swing.JGlassPane第一个隐藏的窗格。除非使用玻璃窗格的 paint()方法,否则它是完全透明的。特可以监听根窗格的输入事件,一般来说,根窗格JRpptPane, 分层窗格JLayeredPane和玻璃窗格JGlassPane都不能直接使用 33.2.1 JFrame 框架JFrame是Frame的Swing版本,是java图形应用程序的顶级容器,他是已具有标题栏和边框的独立窗口显示的。 下面是JFrame中经常使用的属性 contentPane是框架的内容窗格 iconImage是表示框架的图像

相关主题
文本预览
相关文档 最新文档