++ swing读书笔记jinternalframe的使用(窗口与面板)
5-1-1:jinternalframe的使用
类层次结构图:
java.lang.object
--java.awt.component
--java.awt.container
--javax.swing.jcomponent
--javax.swing.jinternalframe
jinternalframe的使用跟jframe几乎一样,可以最大化、最小化、关闭窗口、加入菜单等功能;唯一不同的是jinternalframe是
lightweight component ,也就是说jinternalframe不能单独出现,必须依附在最上层组件上。由于这个特色,jinternalframe能
够利用java提供的look and feel功能作出完全不同于原有操作系统所提供的窗口外型,也比jframe更具有弹性。
一般我们会将internal fram加入desktop pane方便管理,desktop pane是一种特殊的layered pane,用来建立虚拟桌面(vitual
desktop).它可以显示并管理众多internal frame之间的层次关系。以下是jdesktoppane的类层次结构图;
类层次结构图:
java.lang.object
--java.awt.component
--java.awt.container
--javax.swing.jcomponent
--javax.swing.jlayeredpane
--javax.swing.jdesktop
我们先来看看如何构造jinternalframe与jdesktoppane,再来看它跟desktop pane之间的关系。下面分别是jinternalfram与
jdesktoppane的构造函数:
jinternalframe构造函数:
jinternalframe():建立一个不能更改大小、不可关闭、不可最大最小化、也没有标题的internal frame。
jinternalframe(string title):建立一个不能更改大小、不可关闭、不可最大最小化、但具有标题的internal frame。
jinternalframe(string title,boolean resizable):建立一个不可关闭、不可最大最小化、但可变更大小且具有标题的
internal frame。
jinternalframe(string title,boolean resizable,boolean closable):建立一个可关闭、可更改大小、且具有标题,但不可
最大化最小化的internal frame.
jinternalframe(string title,boolean resizable,boolean closable,boolean maximizable):建立一个可关闭、可更改大小、
具有标题、可最大化,但不可最小化的internal frame.
jinternalframe(string title,boolean resizable,boolean closable,boolean maximizable,boolean iconifiable):
建立一个可关闭、可更改大小、具有标题、可最大化与最小化的internal frame.
jdesktoppane构造函数:
jdesktoppane():建立jdesktoppane组件。
如何利用jdesktopane来管理jinternalframe:
jinternalframe1.java
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class jinternalframe1 extends jframe implements actionlistener{
jdesktoppane desktoppane;
int count = 1;
public jinternalframe1() {
super("jinternalframe1");
container contentpane = this.getcontentpane();
contentpane.setlayout(new borderlayout());
jbutton b = new jbutton("create new internal frames");
b.addactionlistener(this);//当用户按下按钮时,将运行actionperformed()中的程序
contentpane.add(b, borderlayout.south);
/*建立一个新的jdesktoppane并加入于contentpane中
*/
desktoppane = new jdesktoppane();
contentpane.add(desktoppane);
setsize(350, 350);
show();
addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
/*产生一个可关闭、可改变大小、具有标题、可最大化与最小化的internal frame.
*/
public void actionperformed(actionevent e)
{
jinternalframe internalframe = new jinternalframe(
"internal frame "+(count++), true, true, true, true);
internalframe.setlocation( 20,20);
internalframe.setsize(200,200);
internalframe.setvisible(true);
//取得jinternalframe的content pane,用以加入新的组件。
container icontentpane = internalframe.getcontentpane();
jtextarea textarea = new jtextarea();
jbutton b = new jbutton("internal frame button");
/*将jtextarea与jbutton对象加入jinternalframe中。由此呆知,jinteranlframe加入组件
*的方式与jframe是一模一样。
*/
icontentpane.add(textarea,"center");
icontentpane.add(b,"south");
//将jinternalframe加入jdesktoppane中,如此一来,即使产生很多jinternalframe,jdesktoppane也
//能将它们之间的关系管理得相当良好。
desktoppane.add(internalframe);
try {
internalframe.setselected(true);
} catch (java.beans.propertyvetoexception ex) {
system.out.println("exception while selecting");
}
}
public static void main(string[] args) {
new jinternalframe1();
}
}
5-1-2:jpanel的使用:
类层次结构图:
java.lang.object
--java.awt.component
--java.awt.container
--javax.swing.jcomponent
--javax.swing.jpanel
panel民是java中时常用到的容器之一,panel除了可以让组件加入外,有效的利用panel可以使版面管理更为容易。swing的
jpanel支持double buffering的功能,使得jpanel在处理动画上更为流畅,较不会有画面闪烁的情况发生。下面为它的构造函
数:
jpanel构造函数:
jpanel():建立一个具有double buffering功能的jpanel,默认的版面管理是flow layout.
jpanel(boolean isdoublebuffered):选择建立是否具有double buffering功能的jpanel,默认的版面管理是flow layout.
jpanel(layoutmanager layout):建立一个具有double buffering功能jpanel,可自定义版面管理器.
jpanel(layoutmanager layout,boolean isdoublebuffered):选择建立是否具有double buffering功能的jpanel,并自定义版面管
理器.
下面这个例子我们用jpanel来排列5个jlabel对象,你将可以发现利用jpanel搭配版面管理,可以做出更复杂的排列效果。
jpanel1.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class jpanel1
{
public jpanel1()
{
jframe f = new jframe("jpaneldemo");
container contentpane = f.getcontentpane();
contentpane.setlayout(new gridlayout(2,1));
jlabel[] label = new jlabel[5];
for(int i=0; i<label.length ; i++)
{
label[i] = new jlabel("label "+(i+1),jlabel.center);
label[i].setbackground(color.lightgray);
label[i].setborder(borderfactory.createetchedborder());
label[i].setopaque(true);//setopaqueiture)方法的目的是让组件变成不透明,这样我们在jlabel上所设置的颜色
// 才能显示出来。
}
jpanel panel1 = new jpanel(new gridlayout(1,1));
panel1.add(label[0]);
jpanel panel2 = new jpanel(new gridlayout(1,2));
jpanel panel3 = new jpanel(new gridlayout(1,2));
panel3.add(label[1]);
panel3.add(label[2]);
jpanel panel4 = new jpanel(new gridlayout(2,1));
panel4.add(label[3]);
panel4.add(label[4]);
panel2.add(panel3);
panel2.add(panel4);
contentpane.add(panel1);
contentpane.add(panel2);
f.pack();
f.show();
f.addwindowlistener(new windowadapter() {
public void windowclosing(windowevent e) {
system.exit(0);
}
});
}
public static void main(string[] arg)
{
new jpanel1();
}
}
由上例可知,利用jpanel可以使版面的排列方式更生动,若没有jpanel的帮助,想直接由contentpane排列成如上例所示,便必须
借助复杂的gridbaglayout版面管理器了。
5-1-3:jsplitpane的使用:
java.lang.object
--java.awt.component
--java.awt.container
--javax.swing.jcomponent
--javax.swing.jsplitpane
split pane(分割面版)一次可将两个组件同时显示在两个显示区中,若你想要同时在多个显示区显示组件,你便必须同时使
用多个split pane。jsplitpane提供两个常数让你设置到底是要水平分割还是垂直分割。这两个常数分别是:horizontal_spit,
vertical_split.除了这两个重要的常数外,jsplitpane还提供许多类常数让你使用,我们会在下面的例子中介绍比较常用的类常数
,其余信息请参年java api.
jsplitpane构造函数:
jsplitpane():建立一个新的jsplitpane,里面含有两个默认按钮,并以水平方向排列,介没有continuous layout功能。
jsplitpane(int neworientation):建立一个指定水平或垂直方向切割jsplitpane,但没有continuous layout功能。
jsplitpnae(int neworientation,boolean newcontinuouslayout):建立一个指定水平或垂直方向切割的jsplitpane,且指定是否具
有continuous layout功能。
jsplitpane(int neworientation,boolean newcontinuouslayout,component newleftcomponent,component newrightcomponent):
建立一个指定水平或垂直方向切割的jsplitpane,且指定显示区所要显示的组件,并设置是否continuous
layout功能。
jsplitpane(int neworientation,component newleftcomponent,component newrightcomponent):
建立一个指定水平或垂直方向切割的jsplitpane,且指定显示区所要显示的组件,但没有continuous layout功能
。
上面所说的continuous layout意思是指当你拖曳切割面版的分隔线时,窗口内的组件是否会随着分隔线的拖曳而动态改变大小
。newcontinuouslayout是一个boolean值,若设为true,则组件大小会随着分隔线的拖曳而一起改动;
若设为false,则组件大小在分隔线停止改动时才确定。你也可以使用jsplitpane中的setcontinuouslayout()方法来设置此项目。
jsplitpane的例子:jsplitpane1.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class jsplitpane1{
public jsplitpane1(){
jframe f=new jframe("jsplitpanedemo");
container contentpane=f.getcontentpane();
jlabel label1=new jlabel("label 1",jlabel.center);
label1.setbackground(color.green);
label1.setopaque(true);//setopaqueiture)方法的目的是让组件变成不透明,这样我们在jlabel上所设置的颜色
// 才能显示出来。
jlabel label2=new jlabel("label 2",jlabel.center);
label2.setbackground(color.pink);
label2.setopaque(true);
jlabel label3=new jlabel("label 3",jlabel.center);
label3.setbackground(color.yellow);
label3.setopaque(true);
/*加入label1,label2到splitpane1中,并设置此splitpane1为水平分割且具有continuous layout的
*功能。
*/
jsplitpane splitpane1=new jsplitpane(jsplitpane.horizontal_split,false,label1,label2);
/*设置splitpane1的分隔线位置,0.3是相对于splitpane1的大小而定,因此这个值的范围在0.0~1.0
*中。若你使用整数值来设置splitpane的分隔线位置,如第34行所示,则所定义的值以pixel为计算单位
*/
splitpane1.setdividerlocation(0.3);
/*设置jsplitpane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能。
*/
splitpane1.setonetouchexpandable(true);
splitpane1.setdividersize(10);//设置分隔线宽度的大小,以pixel为计算单位。
jsplitpane splitpane2=new jsplitpane(jsplitpane.vertical_split,false,splitpane1,label3);
splitpane2.setdividerlocation(35);
//设置jsplitpane是否可以展开或收起(如同文件总管一般),设为true表示打开此功能.
splitpane2.setonetouchexpandable(false);
splitpane2.setdividersize(5);
contentpane.add(splitpane2);
f.setsize(250,200);
f.show();
f.addwindowlistener(
new windowadapter(){
public void windowclosing(windowevent e){
system.exit(0);
}
}
);
}
public static void main(string[] args){
new jsplitpane1();
}
}
闽公网安备 35060202000074号