JInternalFrame、JPanel、JSplitPane简介

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:
 
 
//JInternalFrameDemo.java
import javax.swing.* ;
import java.awt.event.*
;
import java.awt.*
;

public class JInternalFrameDemo extends JFrame implements
 ActionListener
{        
    JDesktopPane desktopPane;    
    
int count = 1
;        
    
    
public
 JInternalFrameDemo() 
    
{
        
super("JInternalFrameDemo"); //set titlke       

        Container contentPane = this.getContentPane();        
        contentPane.setLayout(
new
 BorderLayout());                
        JButton b 
= new JButton("Create New Internal Frames");//set button label        

        b.addActionListener(this);//当用户按下按钮时,将运行actionPerformed()中的程序        
        contentPane.add(b, BorderLayout.SOUTH);        
        
        
/*建立一个新的JDesktopPane并加入于contentPane中*/
        
        desktopPane 
= new
 JDesktopPane();   
        contentPane.add(desktopPane);         
        
this.setSize(350350
);         
        
this.setVisible(true
);                 
        
        
this.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
 JInternalFrameDemo();    
    }

}
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搭配版面管理,可以做出更复杂的排列效果。
//JPanelDemo.java

import java.awt.*;
import java.awt.event.*
;
import javax.swing.*
;

public class
 JPanelDemo
{    
    
public
 JPanelDemo()    
    
{        
        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());            
            
//setOpaqueIture)方法的目的是让组件变成不透明,这样我们在JLabel上所设置的颜色才能显示出来

            label[i].setOpaque(true);
        }
                
        
        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
 JPanelDemo();    
    }

}
  由上例可知,利用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的例子:
 
 
import java.awt.* ;
import java.awt.event.*
;
import javax.swing.*
;

public class
 JSplitPanelDemo
{  
    
public
 JSplitPanelDemo()
    
{     
        JFrame f
=new JFrame("JSplitPaneDemo");//set title    

        Container contentPane=f.getContentPane();     
        JLabel label1
=new JLabel("Label 1"
,JLabel.CENTER);                                 
        label1.setBackground(Color.green);     
        
//setOpaqueIture)方法的目的是让组件变成不透明,这样我们在JLabel上所设置的颜色才能显示出来

        label1.setOpaque(true);
        
        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,true
,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.setVisible(
true
);      
        f.addWindowListener(
new
 WindowAdapter()
        
{               
            
public void
 windowClosing(WindowEvent e)
            
{                  
                System.exit(
0
);                   
            }
               
        }
);       
    }
     
    
    
public static void
 main(String[] args)
    
{     
        
new
 JSplitPanelDemo();  
    }

}
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值