服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

swing读书笔记jinternalframe的使用


  ++ 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();
  }
}

扫描关注微信公众号