Swing/DividerSplitRatio のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DividerSplitRatio へ行く。
TITLE:JSplitPaneのDividerの位置を最大化後に変更する
Posted by aterai at 2011-11-14
JSplitPaneのDividerの位置を最大化後に変更する
JFrameを最大化した後でJSplitPaneのDividerの位置を変更する場合のテストをします。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class SplitPaneWrapper extends JPanel {
public SplitPaneWrapper(JSplitPane splitPane) {
super(new BorderLayout());
this.sp = splitPane;
add(sp);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
sp.setDividerLocation(0.5);
}
});
}
private static int getOrientedSize(JSplitPane sp) {
return (sp.getOrientation() == JSplitPane.VERTICAL_SPLIT)
? sp.getHeight() - sp.getDividerSize()
: sp.getWidth() - sp.getDividerSize();
}
private int prev_state = Frame.NORMAL;
@Override public void doLayout() {
int size = getOrientedSize(sp);
final double proportionalLocation = sp.getDividerLocation()/(double)size;
super.doLayout();
if(!flag) return;
int state = ((Frame)SwingUtilities.getWindowAncestor(sp)).getExtendedState();
if(sp.isShowing() && state!=prev_state) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
int s = getOrientedSize(sp);
int iv = (int)Math.round(s * proportionalLocation);
sp.setDividerLocation(iv);
}
});
prev_state = state;
}
}
}
解説
- JSplitPane#setResizeWeight(0.0)なので、JFrameをマウスでリサイズしても上コンポーネントの高さが維持される
- JSplitPaneをラップするJPanelのdoLayout()メソッドをオーバーライドして、最大化、通常化の前後で上下コンポーネントの高さの比率を維持する
- EventQueue.invokeLater(...)を使って、後でJSplitPane#setDividerLocation(int)でディバイダーの位置を調節
- デフォルト("MAXIMIZED_BOTH: keep the same splitting ratio"チェックボックスのチェックを外している状態):
- 例えば、最大化後にディバイダーをすこし上に移動してJFrameを元に戻す(縮小)と、上コンポーネントの方が下コンポーネントより高くなる
JSplitPane#setDividerLocation(double)は、内部でJSplitPane#setDividerLocation(int)を呼び出しているが、その変換の際に値を切り捨てているので、上記のサンプルでは最大化、元に戻す(縮小)を行なっても、同じ値になるように四捨五入するよう変更している。