固定JSplitPane比例分割

从事Swing的开发已经有一年时间了,常常涉及一些Swing控件的使用,比如JSplitPane,有时要求以固定的比例来分割左右/上下子控件的固度/高度。


JSplitPane提供了这样一个方法来控制分割栏所处的位置:

public void setDividerLocation(double proportionalLocation)
    设置分隔条的位置为 JSplitPane 大小的一个百分比。
    根据 setDividerLocation(int) 来实现此方法。此方法以分隔窗格的当前大小为基础迅速改变窗格的大小。如果分隔窗格没有正确地实现并且不显示在屏幕上,此方法将不产生任何影响(新的分隔条位置将成为 0(当前的 size * proportionalLocation ))。

    参数:
    proportionalLocation - 指示百分比的双精度浮点值,从 0 (top/left) 到 1.0 (bottom/right)
    抛出:
    IllegalArgumentException - 如果指定的位置为 < 0 or > 1.0

 

我们来看下setDividerLocation(double proprtionalLocation)的实现:

    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(int)来实现的,呵呵~

 

下面是一个小小的示例:

import java.awt.BorderLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

public class Test {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		
		final JSplitPane splitPane = new JSplitPane();
		splitPane.add(new CustomPanel(), JSplitPane.LEFT);
		splitPane.add(new CustomPanel(), JSplitPane.RIGHT);
		splitPane.addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				splitPane.setDividerLocation(1.0 / 3.0);
			}
		});
		frame.add(splitPane);
		
		frame.setTitle("Hello JSplitPane");
		frame.setSize(300, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

class CustomPanel extends JPanel {
	private static int id = 0;
	
	public CustomPanel() {
		setLayout(new BorderLayout());
		add(new JTextArea("" + id++), BorderLayout.CENTER);
	}
}

 

下面是Mac OS X的截图:

你可能感兴趣的:(swing,OS)