Swing中的JSplitPane(分割⾯板)
Swing中的JSplitPane(分割⾯板)
引⾔
JSplitPane ⽤于分隔两个(只能两个)Component。两个 Component 图形化分隔以外观实现为基础,并且这两个 Component 可以由⽤户交互式调整⼤⼩。有关如何使⽤ JSplitPane 的信息,请参阅 中的 How to Use Split Panes ⼀节。
使⽤ JSplitPane.HORIZONTAL_SPLIT 可让分隔窗格中的两个 Component 从左到右排列,或者使⽤ JSplitPane.VERTICAL_SPLIT 使其从上到下排列。改变 Component ⼤⼩的⾸选⽅式是调⽤ setDividerLocation,其中 location 是新的 x 或 y 位置,具体取决于JSplitPane 的⽅向。
要将 Component 调整到其⾸选⼤⼩,可调⽤ resetToPreferredSizes。
当⽤户调整 Component 的⼤⼩时,Component 的最⼩⼤⼩⽤于确定 Component 能够设置的最⼤/最⼩位置。如果两个组件的最⼩⼤⼩⼤于分隔窗格的⼤⼩,则分隔条将不允许您调整其⼤⼩。改变 JComponent 最⼩⼤⼩,请参阅 。
当⽤户调整分隔窗格⼤⼩时,新的空间以 resizeWeight 为基础在两个组件之间分配。默认情况下,值为 0 表⽰右边/底部的组件获得所有空间,⽽值为 1 表⽰左边/顶部的组件获得所有空间。
补充说明:
这⾥的JComponebt.SetMinimumSize(java.awt.Dimension):⽤于设置组件的最⼩值,这⾥的Dimension是⼀个封装组件的⾼度和宽度的⼀个类,其中的⼀个构造函数就是Dimension(int width,int height),详情见,当然有设置最⼩的就有设置最⼤的啊,详情看⽂档吧
构造函数
public JSplitPanel():创建⼀个配置为将其⼦组件⽔平排列、⽆连续布局、为组件使⽤两个按钮的新 JSplitPane
public JSplitPanel(int newOrientation):创建⼀个指定⽅向的分割板,这⾥的newOrientation可以设置两个值, VERTICAL_SPLIT(设置分割板为上下布局),HORIZONTAL_SPLIT(设置分隔板左右布局)
public JSplitPane(int newOrientation,Component newLeftComponent,Component newRightComponent):创建⼀个具有指定⽅向和不连续重绘的指定组件的新 JSplitPane。
public JSplitPane(int newOrientation,boolean newContinuousLayout,Component newLeftComponent,Component newRightComponent):创建⼀个具有指定⽅向、重绘⽅式和指定组件的新 JSplitPane。
常⽤⽅法
setContinuousLayout(boolean newContinuousLayout):设置是否连续重新显⽰组件,如果为false就会发现在调整⾯板的过程中会显⽰⼀道⿊线,只有当停下的时候才能正常的显⽰,默认是false
setDividerSize(int newSize):设置分割条的⼤⼩
* setDividerLocation(double size):设置分隔条的位置,这⾥的size是⼩数,个⼈觉得官⽅⽂档好像这⾥有点对劲,相当于占整个⾯板的百分⽐setLeftComponent(Componentcomp)/setTopComponent(Component comp): 将组件设置到分隔条的上⾯或者左边。
setRightComponent(Component comp)/setBottomComponent(Component comp):将组件设置到分隔条的下⾯或者右边。
setOneTouchExpandable(boolean newValue):设置 oneTouchExpandable 属性的值,要使 JSplitPan
e 在分隔条上提供⼀个 UI ⼩部件来快速展开/折叠分隔条,此属性必须为 true。
补充说明:
上⾯只是常⽤的⼏个函数,具体的请看官⽅⽂档,注意这⾥的setLeftComponent的四个设置组件的函数要根据分隔板的分布来确定
开始撸代码
初步实现(创建两个按钮实现分隔板的布局)
import javax.swing.JFrame;
import javax.swing.JSplitPane;
public class Main {
public static void main(String[] a) {
JFrame horizontalFrame = new JFrame();
horizontalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent topButton = new JButton("Left");
JComponent bottomButton = new JButton("Right");
final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setTopComponent(topButton);
splitPane.setBottomComponent(bottomButton);
horizontalFrame.add(splitPane, BorderLayout.CENTER);
horizontalFrame.setSize(150, 150);
horizontalFrame.setVisible(true);
splitPane.setDividerLocation(0.5);
}
}
更进⼀步(两种布局的操作)
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSplitPane;
public class Main {
public static void main(String[] a) {
JFrame horizontalFrame = new JFrame();
horizontalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent leftButton = new JButton("Left");
JComponent rightButton = new JButton("Right");
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setLeftComponent(leftButton);
splitPane.setRightComponent(rightButton);
horizontalFrame.add(splitPane, BorderLayout.CENTER);
horizontalFrame.setSize(150, 150);
horizontalFrame.setVisible(true);
}
}
嵌套分隔板
public class Main{
public static void main(String[] a) {
int HORIZSPLIT = JSplitPane.HORIZONTAL_SPLIT;
int VERTSPLIT = JSplitPane.VERTICAL_SPLIT;
boolean continuousLayout = true;
JLabel label1 = new JLabel("a");
JLabel label2 = new JLabel("b");
JLabel label3 = new JLabel("c");
JSplitPane splitPane1 = new JSplitPane(VERTSPLIT, continuousLayout, label1, label2);
splitPane1.setOneTouchExpandable(true);
splitPane1.setDividerSize(2);
splitPane1.setDividerLocation(0.5);
JSplitPane splitPane2 = new JSplitPane(HORIZSPLIT, splitPane1, label3);//将分隔板和⼀个label放在第⼆个分割板中实现嵌套    splitPane2.setOneTouchExpandable(true);
splitPane2.setDividerLocation(0.4);
splitPane2.setDividerSize(2);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(splitPane2);
frame.pack();
frame.setVisible(true);
}
}
事件监听
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
// w  w  w . j a  va2s .  co m
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSplitPane;
public class Main {
public static void main(String args[]) {
JFrame frame = new JFrame("Property Split");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setContinuousLayout(true);
splitPane.setOneTouchExpandable(true);
JComponent topComponent = new JButton("A");
splitPane.setTopComponent(topComponent);
JComponent bottomComponent = new JButton("B");
splitPane.setBottomComponent(bottomComponent);
PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent changeEvent) {
JSplitPane sourceSplitPane = (JSplitPane) Source();
String propertyName = PropertyName();
if (propertyName.equals(JSplitPane.LAST_DIVIDER_LOCATION_PROPERTY)) {
int current = DividerLocation();
java中split的用法System.out.println("Current: " + current);
Integer last = (Integer) NewValue();
System.out.println("Last: " + last);
Integer priorLast = (Integer) OldValue();
System.out.println("Prior last: " + priorLast);
}
}
};
splitPane.addPropertyChangeListener(propertyChangeListener);
frame.add(splitPane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
}
}
说明
⽆论 bean 何时更改 bound 属性,都会激发⼀个 PropertyChange 事件。可以向源 bean 注册⼀个 PropertyChangeListener,以便获得所有绑定 (bound) 属性更改的通知。
⽆论 bean 何时更改 “bound” 或 “constrained” 属性,都会提交⼀个 “PropertyChange” 事件。PropertyChangeEvent 对象被作为参数发送给 PropertyChangeListener 和 VetoableChangeListener ⽅法。
通常 PropertyChangeEvent 还附带名称和已更改属性的旧值和新值。如果新值是基本类型(⽐如 int 或 boolean),则必须将它包装为相应的 java.lang.* Object 类型(⽐如 Integer 或 Boolean)。
如果旧值和新值的真实值是未知的,则可能为它们提供 null 值。
事件源可能发送⼀个 null 对象作为名称,以指⽰其属性的任意事件集已更改。在这种情况下,旧值和新值应该仍然为 null。
getSource():返回最初未变化的对象,未Object类型的,因此这⾥需要强制转换成JSplitPanel
参考⽂章
版权信息所有者:chenjiabing
如若转载请标明出处:chenjiabing666.github.io6

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。