JSplitPane按比例分割的问题

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按比例分割的问题

时间: 2024-10-13 11:37:11

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

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

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

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

这里实现 两个 编辑框同一水平上 按1:1分割空间 这里的1:1 比例可以通过 lp1.weight :  1p2.weight  =m:n 实现 { LinearLayout l=new LinearLayout(this); EditText et1 = new EditText(this); //这里只有LinearLayout.LayoutParams 才有 .weight属性 LinearLayout.LayoutParams lp1=new LinearLayout.LayoutPa

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

父级容器的宽度一定,要实现子元素等比例完美均分父级宽度,实现方式有哪些? html部分代码: 方法一: 浮动布局+百分比 (将子元素依次左浮动,根据子元素的个数,设定每个子元素的宽度百分比) 方法二:行内元素(inline-block)+百分比 方法三: 父元素  display:table  +  子元素   display:table-cell 方法四: css3  display:flex:(flex布局) 方法五:栅格系统(bootstrap) 给子元素添加class属性        

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

视频下载:https://yunpan.cn/cvujkpKIqwccn  访问密码 e9f4

jsplitPane 的用法

JSplitPane详解 java.lang.Object    --java.awt.Component    --java.awt.Container       --javax.swing.JComponent          --javax.swing.JSplitPane       Split Pane(分割面版)一次可将两个组件同时显示在两个显示区中,若你想要同时在多个显示区显示组件,你便必须同时使用多个Split Pane.JSplitPane提供两个常数让你设置到底是要水平分

JSplitPane demo

package example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; i

对图片进行分割 ---- 抠图

//<4> 创建16个UIImageView显示分割以后的小图片 for(int i = 0;i<4;i++) { for(int j = 0;j<4;j++) { UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(2 + width * j, 2 + height * i, width - 2, height -2)]; //imageView.backgroundColor = [UIC

JSplitPane详解

摘自http://blog.163.com/[email protected]/blog/static/1262673422010102711295541/ JSplitPane详解 pasting java.lang.Object    --java.awt.Component    --java.awt.Container       --javax.swing.JComponent          --javax.swing.JSplitPane       Split Pane(分割面

关于微信小程序的尺寸关系

在微信小程序开发中,大家尽量使用rpx为单位, px实际上就是系统级的rem(把页面按比例分割750份,1rpx=window.innerWidth/750),或者scale伸缩布局的width=750.也就是说,微信小程序的rpx布局帮大家把rem布局的js设置根元素字体尺寸这步省了,用rpx就减少了媒体查询的那些步骤 通过rpx,大家只需要根据750的设计稿写代码即可,不必担心它在各个平台的适配情况, rem的优势:rem是淘宝移动web端就是采用此方案,其中r可以理解成root,不同的页面