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