JSplitPane的使用方法详解

转自:http://hi.baidu.com/945feng/blog/item/4fd49d263c79f2148b82a163.html

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

 转自:http://www.cnblogs.com/jishu/archive/2011/03/23/1992270.html

1、swing分割窗口控件JSplitPane,用来将窗口分割成两个部分。

 2、分割后的窗口每个窗口只能放一个控件,想要方多个控件的话,可以在上面方一个JPane面板,这样就可以方多个控件。

 3、JSplitPane myJSplitPane=new JSplitPane(int newOrientaion,boolean new ContinuousLayout);

         newOrientaion:可选值为:JSplitPane.HORIZONTAL_SPLIT

                                         JSplitPane,VERTUCAL_SPLIT

   4、常用方法

       ①、setDividerSize(int size)设置分割条的大小。

       ②、getDividerSize()得到分割条的大小。

       ③、setDividerLocation(int size)按照百分比设置分割条的位置。

       ④、getOrientation获得方向。

  5、使用 JSplitPane 监听窗口缩放事件

JSplitPane splitPane = new javax.swing.JSplitPane();    
         splitPane.addPropertyChangeListener(new java.beans.PropertyChangeListener() {    
             public void propertyChange(java.beans.PropertyChangeEvent evt) {    
                 if (evt.getPropertyName().equals(JSplitPane.DIVIDER_LOCATION_PROPERTY)) {    
                     //action code    
                 }    
             }    
         }); 

   6、JSplitPane按比例分割的问题

JSplitPane看似比Delphi的spliter
难用许多。不过介于swing可以方便的使用记事本一类文本编辑器直接书写依据布局的界面代码我们还是姑且容忍它带来的不便。但在使用
JSplitPane时候在MSDN上被问的比较频繁却没有良好答案的问题是JSplitPane如何按比例分
(http://www.my400800.cn)割,setDividerLocation(double d)为什么没有作用。

要解决这个问题首先看JAVA DOC.关于setDividerLocation的介绍是这样的:
setDividerLocation

public void setDividerLocation(double proportionalLocation)

    设置分隔条的位置为 JSplitPane 大小的一个百分比。

    根据 setDividerLocation(int) 来实现此方法。此方法以分隔窗格的当前大小为基础迅速改变窗格的大小。如果分隔窗格没有正确地实现并且不显示在屏幕上,此方法将不产生任何影响(新的分隔 条位置将成为 0(当前的 size * proportionalLocation ))。

参数:
    proportionalLocation - 指示百分比的双精度浮点值,从 0 (top/left) 到 1.0 (bottom/right)
抛出:
    IllegalArgumentException - 如果指定的位置为 < 0 or > 1.0

看完后没什么概念。。。只觉得写的不是那么直白,也许确有什么猫腻在里边。特别是"如果分隔窗格没有正确地实现并且不显示在屏幕上,此方法将不产生任何影响"这句,没大理解。。。

因而去看看JSplitPane的源码。关于setDividerLocation大致如下:

  

public void setDividerLocation(double proportionalLocation) {
       if (proportionalLocation < 0.0 ||
          proportionalLocation > 1.0) {
           throw new IllegalArgumentException("proportional location must " +
                                              "be between 0.0 and 1.0.");
       }
       if (getOrientation() == VERTICAL_SPLIT) {
           setDividerLocation((int)((double)(getHeight() - getDividerSize()) *
                                    proportionalLocation));
       } else {
           setDividerLocation((int)((double)(getWidth() - getDividerSize()) *
                                    proportionalLocation));
       }
   }


这下有些明白了,setDividerLocation(double)这个函数会用到getWidth()或者 getHeight()这样的函数,而java桌面程序在没有主窗体setVisible之前,如果使用布局,尚未validate()和paint() 每个组件的宽和高默认都是0。也就是说一定要在主窗体setVisible(true)之后再使用setDividerLocation(double) 才会有效。

下边给出一个例子:
package tlw.zbe.info.stratch;
 
import javax.swing.JFrame;
import javax.swing.JSplitPane;
import java.awt.BorderLayout;
import javax.swing.JPanel;
 
public class MainFrame extends JFrame {
    public static void main(String[] args){
        MainFrame f=new MainFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设定窗体关闭后自动退出进程
        f.setSize(800,600);//设定窗体的默认尺寸
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);//设定窗体状态为屏幕最大化,即全屏尺寸。
        f.setVisible(true);//显示窗体
        f.jSplitPane1.setDividerLocation(0.7);//设定分割面板的左右比例(这时候就生效了,如果放在setVisible(true)这据之前就不会有效果。)
    }
    public MainFrame() {
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 
    private void jbInit() throws Exception {
        this.getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);
        jSplitPane1.add(jPanel1, JSplitPane.LEFT);
        jSplitPane1.add(jPanel2, JSplitPane.RIGHT);
    }
 
    JSplitPane jSplitPane1 = new JSplitPane();
    JPanel jPanel1 = new JPanel();
    JPanel jPanel2 = new JPanel();
}

很好看出是JBuilder的界面代码,运行它会发现JSplitPane已经乖乖的按照比例分割。问题是当拖动split后界面做一个最大化后比例不能维持。解决这个问题就是加一个ComponentListener。例如下:

package tlw.zbe.info.stratch;
 
import javax.swing.JFrame;
import javax.swing.JSplitPane;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentAdapter;
 
public class MainFrame extends JFrame {
    public static void main(String[] args){
        MainFrame f=new MainFrame();
    }
    private void myInit(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设定窗体关闭后自动退出进程
        setSize(800,600);//设定窗体的默认尺寸
        setVisible(true);//显示窗体
        jSplitPane1.setDividerLocation(0.7);//设定分割面板的左右比例(这时候就生效了,如果放在setVisible(true)这据之前就不会有效果。)
        /*****初始化事件***/
        this.addComponentListener(new ComponentAdapter(){
            public void componentResized(ComponentEvent e) {
                jSplitPane1.setDividerLocation(0.7);
            }
        });
    }
    public MainFrame() {
        try {
            jbInit();
            myInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 
    private void jbInit() throws Exception {
        this.getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);
        jSplitPane1.add(jPanel1, JSplitPane.LEFT);
        jSplitPane1.add(jPanel2, JSplitPane.RIGHT);
    }
 
    JSplitPane jSplitPane1 = new JSplitPane();
    JPanel jPanel1 = new JPanel();
    JPanel jPanel2 = new JPanel();
}


看到有个myInit()方法?这是我个人的习惯,自己写的界面代码区为了分于生成的都放在myInit()下边。一般来说里边初始化一些界面默认值和界面事件。添加的ComponentListener决定了任意改变界面尺寸后JSplitPane都会按比例分割。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值