Swing/DividerSplitRatio のバックアップ差分(No.3)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DividerSplitRatio へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JSplitPaneのDividerの位置を最大化後に変更する #navi(../) RIGHT:Posted by &author(aterai); at 2011-11-14 *JSplitPaneのDividerの位置を最大化後に変更する [#c2bc19e0] JFrameを最大化した後でJSplitPaneのDividerの位置を変更する場合のテストをします。 --- title: JSplitPaneのDividerの位置を最大化後に変更する tags: [JSplitPane, JFrame] author: aterai pubdate: 2011-11-14T11:39:46+09:00 description: JFrameを最大化した後でJSplitPaneのDividerの位置を変更する場合のテストをします。 --- * 概要 [#c2bc19e0] `JFrame`を最大化した後で`JSplitPane`の`Divider`の位置を変更する場合のテストをします。 -&jnlp; -&jar; -&zip; #download(https://lh3.googleusercontent.com/-w5-YQDwojUs/TsB7EdoVlLI/AAAAAAAABEw/p_PcxHKKeRk/s800/DividerSplitRatio.png) //#screenshot #ref(https://lh3.googleusercontent.com/-w5-YQDwojUs/TsB7EdoVlLI/AAAAAAAABEw/p_PcxHKKeRk/s800/DividerSplitRatio.png) **サンプルコード [#z59fb02b] * サンプルコード [#z59fb02b] #code(link){{ 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; } } } }} **解説 [#bba59268] - JSplitPane#setResizeWeight(0.0)なので、JFrameをマウスでリサイズしても上コンポーネントの高さが維持される - JSplitPaneをラップするJPanelのdoLayout()メソッドをオーバーライドして、最大化、通常化の前後で上下コンポーネントの高さの比率を維持する -- EventQueue.invokeLater(...)を使って、後でJSplitPane#setDividerLocation(int)でディバイダの位置を調節 -- デフォルト("MAXIMIZED_BOTH: keep the same splitting ratio"チェックボックスのチェックを外している状態): --- 例えば、最大化後にディバイダをすこし上に移動してJFrameを元に戻す(縮小)と、上コンポーネントの方が下コンポーネントより高くなる * 解説 [#bba59268] - `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)を呼び出しているが、その変換の際に値を切り捨てているので、上記のサンプルでは最大化、元に戻す(縮小)を行なっても、同じ値になるように四捨五入するよう変更している。 `JSplitPane#setDividerLocation(double)`は、内部で`JSplitPane#setDividerLocation(int)`を呼び出しているが、その変換の際に値を切り捨てているので、上記のサンプルでは最大化、元に戻す(縮小)を行なっても、同じ値になるように四捨五入するよう変更している。 **参考リンク [#n51c02d3] -[[JSplitPaneを等分割する>Swing/DividerLocation]] * 参考リンク [#n51c02d3] - [[JSplitPaneを等分割する>Swing/DividerLocation]] **コメント [#bfc3dc9c] * コメント [#bfc3dc9c] #comment #comment