- 浏览: 51975 次
- 性别:
- 来自: 成都
-
最新评论
-
zeyonq:
原来就是这种龟毛问题困了我一宵。多谢指点。
关于Eclipse“The selection is not within a valid module”的异常 -
cloud21:
为什么我照着写,写不进去,键盘 信息,只有一个退出信息。。
...
C实现Windows全局钩子
JSplitPane看似比Delphi的spliter难用许多。不过介于swing可以方便的使用记事本一类文本编辑器直接书写依据布局的界面代码我们还是姑且容忍它带来的不便。但在使用JSplitPane时候在MSDN上被问的比较频繁却没有良好答案的问题是JSplitPane如何按比例分割,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都会按比例分割。
发表评论
-
在JAR包中读取图片
2010-02-01 13:59 2214当你编写一个图形界面的程序的时候,你肯定要使用各种图片资源。那 ... -
JVM内存大小设置(java heap space)(转)
2010-01-16 14:22 7337一般情况下java程序容易出现java heap space ... -
利用Java生成静态HMTL页面的方法收集
2010-01-12 14:21 1071生成静态页面技术解决方案之一 转载者前言:这是一个全面的jsp ... -
Hibernate类型和java类型和sql类型
2009-11-11 16:05 770... -
Struts2表单中文乱码问题的解决
2009-11-10 21:58 2474关于Struts2提交表单中文乱码的问题,在网上搜到了很多解决 ... -
用来遮字幕的程序
2009-11-07 22:52 1152看日剧的时候,不想看到中文字幕。所以写了这个程序来遮住字幕。 ... -
另类的Struts配置
2009-10-27 20:00 976JPetStore-5.0程序中不一样的struts 关键字: ... -
Applet中显示模式对话框
2009-10-22 14:58 1283首先,我们看一下Applet的父级容器。如下: |--> ... -
第一个Struts2的例子
2009-09-24 22:49 1033文档结构 lib文件夹 struts.xml &l ... -
java中用process备份还原mysql数据库
2009-09-19 11:41 1177/** * 备份数据库. */ public int d ... -
Spring的singleton模式
2009-08-24 23:23 931Compnay类 package ioc.demo; p ... -
关于Eclipse开发Web Service的一点总结
2009-08-23 17:16 1246用Eclipse开发webservice确实很方便,无论是服务 ... -
测试WebService是否正常运行的代码
2009-08-17 17:04 1347try { // 服务端的url,需要根据情况 ... -
关于Eclipse“The selection is not within a valid module”的异常
2009-08-03 20:28 4777在工程目录下的.settings文件夹里,有个名为org.ec ... -
自制的Java超链接按钮
2009-02-11 09:35 1841package lib; import java.awt ...
相关推荐
当我们需要根据特定的比例设置分割条的位置时,setDividerLocation(int size)方法会根据提供的百分比来定位分割条。而getOrientation()方法则用于获取JSplitPane分割的方向,即垂直分割或水平分割。 JSplitPane构造...
JSplitPane的主要属性包括分隔条的位置、分割模式(是否允许用户调整大小)以及预设的组件大小比例。通过调整这些属性,开发者可以创建出满足特定需求的分割视图。 总的来说,这个“窗口视图的分割演示程序”是一个...
`JSplitPane`是Java Swing中的一个容器,它可以容纳两个或更多的组件,这些组件被水平或垂直地分割。默认情况下,`JSplitPane`提供了一个分隔条,用户可以通过拖动这个分隔条来改变两侧组件的显示面积。在`myEclipse...
总结来说,这个基于Swing的编辑器界面项目涉及了Swing的核心组件和功能,包括JTabbedPane(可关闭的选项卡面板)、文件操作、JSplitPane(分割面板)和JScrollPane(滚动面板)。通过学习和实践这些知识,开发者能够...
在这个示例中,我们创建了一个水平分割的`JSplitPane`,并设置了初始的分割位置。用户可以通过拖动分割线来调整两个窗格的大小比例。 ### 结论 Swing提供了丰富的布局管理器和组件,通过合理选择和配置,可以轻松...
创建了一个水平分割的`JSplitPane`,并设置了分割线的位置和大小。 - **事件处理**: ```java public void actionPerformed(ActionEvent arg0) { if (arg0.getSource() == jb1) { cl.show(jp3, "1"); } else ...
通过查看源代码,开发者可以深入理解如何实现这种自定义控件,包括如何处理鼠标事件、如何绘制分隔线以及如何在窗口重绘时保持正确的分割比例。此外,源码也可以作为模板,供其他开发者在自己的项目中创建类似功能的...
`JSplitPane`用于创建分隔的面板,可以水平或垂直分割,支持动态调整两个子面板的比例。构造函数接受一个分割方向、是否连续调整大小以及两个子组件。 - 分割方向通过常量`HORIZONTAL_SPLIT`(水平)或`VERTICAL_...
最后,`JSplitPane`用于创建可调整大小的分割面板,允许用户动态调整日历和记事本区域的显示比例。这使得用户可以根据需要更自由地查看和编辑内容。 总结起来,这个Java程序设计了一个功能丰富的日历记事本应用,...