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

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

setDividerLocationpublic 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都会按比例分割。

JSplitPane按比例分割的问题的更多相关文章

  1. arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具

    arcgis 按面积分割, 按比例分割面积,按等份批量面积分割工具 视频下载:https://yunpan.cn/cvujkpKIqwccn  访问密码 e9f4

  2. ArcGIS AddIn 图斑比例分割工具,调用捕捉功能

    最近做一个图斑按比例分割的工具,需要绘制一条用以切割的方向线,通过Tool的方式实现 绘制时希望能够使用捕捉功能,查阅相关资料如下: 使用该文章,第Implementing snapping in a ...

  3. objectarx 按比例分割封闭多段线

    测试结果:这个是按0.1,0.1,0.1,0.3,0.4的比例划分的. 插件描述:这个插件主要是选择一个多段线poly,设置poly的close属性为true,在poly任意一侧画一条长线line(l ...

  4. Android 动态添加线性布局(.java文件内) 实现控件按比例分割空间

    这里实现 两个 编辑框同一水平上 按1:1分割空间 这里的1:1 比例可以通过 lp1.weight :  1p2.weight  =m:n 实现 { LinearLayout l=new Linea ...

  5. css等比例分割父级容器(完美三等分)

    html部分代码: 方法一: 浮动布局+百分比 (将子元素依次左浮动,根据子元素的个数,设定每个子元素的宽度百分比) 方法二:行内元素(inline-block)+百分比 方法三: 父元素  disp ...

  6. 高级组件——分割面板JSplitPane

    分割面板:JSplitPane(方向),默认水平分割.JSplitPane.HORIZONTAL_SPLIT,JSplitPane.VERTICAL_SPLITJSplitPane(方向,boolea ...

  7. JSplitPane详解

    摘自http://blog.163.com/xiexueyong1987@126/blog/static/1262673422010102711295541/ JSplitPane详解 pasting ...

  8. JSplitPane demo

    package example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; imp ...

  9. 微信小程序新单位rpx与自适应布局

    rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我 ...

随机推荐

  1. Cloudera 5.8.3 SolrCloud+HDFS的索引数据备份和恢复。(需重启solr进程。)

    一.备份基于HDFS的solrCloud集合数据 1.确认要备份的solr文件夹. /solr/history_customer_collection_test 2.开启HDFS快照功能. hdfs ...

  2. vs code--snippet与快速提示

    因为快速语法提示和建议冲突,所以要么禁用语法提示,要么禁用建议 Note that quick suggestions and Tab completion might interfere becau ...

  3. [bzoj3932][CQOI2015]任务查询系统_主席树

    任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...

  4. [bzoj2748][HAOI2012]音量调节_动态规划_背包dp

    音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...

  5. kettle 递归循环

    var i = new Number(parent_job.getVariable(; parent_job.setVariable("i",i); true;

  6. Shell、Xterm、Gnome-Terminal、Konsole简介(转)

    什么是Shell? 简单的说, Shell就是一个小程序,这个小程序可以接受来自键盘的命令并把这些命令发送到操作系统,再有系统来执行.在过去,在安装有Unix的计算机上,这是唯一的可用的交互式操作.而 ...

  7. 非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json

    非form表单提交的数据就要用@requestbody注解获取http传过来的值,尤其json

  8. EL表达式无法被解析

    刚困死了,但是手上还在debug一个东西.然后就发现

  9. @RequiresPermissions 注解说明

    @RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ...

  10. Android开发时经经常使用的LogUtil

    在开发过程中经经常使用到Log.我们常写的一种方式就是自己定义一个LogUtil工具类 private static boolean LOGV = true; private static boole ...