web-dev-qa-db-ja.com

JSplitPaneが50%正確に分割

Swingで、JSplitPaneが2つのjpanelをそれぞれ50%のサイズで分割するための最良の方法は何ですか。

パネルに希望のサイズを設定しないと、常に最初のパネルがほとんど見えなくなり(2%)、2番目のパネルがほとんど見えなくなる(98%)ようです。

前もって感謝します

25
user278731

使用する

setResizeWeight(.5d);

[...]デフォルトの値0は、右/下のコンポーネントがすべての余分なスペースを取得することを示します(左/上のコンポーネントは固定されて動作します)。一方、値1は、左/上のコンポーネントがすべての余分なスペースを取得することを指定しますスペース(右/下のコンポーネントは固定されています)。 [...]

27
Peter Lang

setDividerLocation(double proportionalLocation) を使用して、JSplitPane初期空間分布を決定する必要があります。次に、同じ値でsetResizeWeight(double)を呼び出して、ペインのサイズが比例して変更されるようにします。

また、注意してください:JSplitPaneが表示される前にsetDividerLocation(double)を呼び出すと、スペースの計算として正しく機能しませんComponentの現在のサイズに基づいています。代わりに、JPanelを含むJSplitPaneのPaintメソッドをオーバーライドするなど、厄介なハックを行う必要があります。

private boolean painted;

@Override
public void Paint(Graphics g) {
    super.Paint(g);

    if (!painted) {
        painted = true;
        splitPane.setDividerLocation(0.25);
    }
}
29
Adamski

同様の問題が発生し、親コンテナのコンポーネントリスナーを使用して問題を解決し、最初のサイズ変更時に仕切りの位置を設定しました。変数firstResizeをtrueに初期化し、これを親コンテナーコンストラクターに追加します。

addComponentListener(new ComponentAdapter(){
    @Override
    public void componentResized(ComponentEvent e) {
        if(firstResize){
            splitPane.setDividerLocation(0.5);
            firstResize = false;
        }
    }
});

これにより、親コンテナのサイズが最初に設定されたときに、仕切りが中央に配置されます。

4
William Dutton

ここでの解決策は、ユーザーが仕切りを移動する場合(つまり、可変の仕切りの位置)を考慮していません。これを考慮した完全な例は、次の場所にあります。

ユーザーが仕切りの位置を移動した場合、JSplitPaneが同じ比例位置を維持するにはどうすればよいですか

0
John