2

JXMultiSplitPane(SwingX 1.6.2 から) を使用して、3 ペインの水平インターフェイスを実装しています。中央のペインにはJTabbedPane2 つのタブがあります。1 つはMarkdown コードの入力に使用される (もちろんJTextArea内の) で、もう 1 つはレンダリングされた HTML プレビューを表示するための (スクロール ペイン内) です。ユーザーがプレビュー ペインに切り替えると、エディター内のテキストが処理され、プレビュー ペインに表示されます。JScrollPaneJEditorPane

私の問題は、エディターに長い行でテキストを入力してからプレビューに切り替えると、中央のペインが拡大することです。ほんの少しだけの場合もあれば、実際の画面よりも多くのスペースを占める場合もあります。しかし、サイズ変更ハンドルの 1 つを手動で移動すると、すべてが所定の位置に戻ります。

これが発生する前にこれに対処する方法は2つしかありません。

  1. テキストを入力する前に、いずれかのペインのサイズを手動で変更します。
  2. MultiSplitLayout モデルで、中央のペインに 1 の重みを付けます。

デフォルトでは、中央のペインを拡大してほぼウィンドウ全体を占めるため、2番目のものは使用できません。

これを修正する方法はありますか?

アップデート

もう少しテストした後、手法 (2) でさえサイズを一定に保ちません。2 つのタブを切り替えると、中央のペインのサイズがわずかに変わります。

問題の一部はタブ付きペインにあると考えています。JTextAreaとはJEditorPane同じサイズではなく、JTabbedPaneそれらを切り替えるとサイズが変更されます (JEditorPane毎回テキストをリセットしているためです。JXMultiSplitPaneユーザーが強制的に手動でサイズ変更することにより、特定のサイズ。

したがって、サイズを固定することで問題を解決できるはずですがJTabbedPane、ハンドルバーでサイズを変更することもできます。それを行うためのヒントはありますか?

4

1 に答える 1

1

MultiSplitLayout は .. LayoutManager であるため、それがどのように機能するかを理解する必要があります (私も、あまりよく知りません :-)

基本的なレイアウトは、コンポーネントの prefSize に従って行われます。重みは、pref に対して余分な/不足しているスペースを分配するためのものです。デフォルトでは、ディバイダは「フローティング」です。つまり、基本メカニズムによってレイアウトされたコンポーネント間に配置されます。ユーザーがディバイダーに触れた瞬間、ディバイダーは「非フローティング」になり、ディバイダーの間に収まるようにサイズが調整されます。これが、仕切りを一度移動した後にサイズ貪欲が表示されない理由です。したがって、1つの方法は、

  • JXMultiSplitPane を通常どおりセットアップし、コンポーネントを追加してフレームを実現します。
  • マネージャーが最初のレイアウトを行った後、仕切りを修正します

    String layout = "(ROW " +
        "(LEAF name=selector weight=0.15)" +
        "(LEAF name=center weight=0.7)" +
        "(LEAF name=list weight=0.15)" +
    ")";
    
    JXMultiSpitPane pane = new JXMulitSplitPane((MultiSplitLayout.parseModel(layout))
    // add components and realize the frame  
    ...
    pane.getMultiSplitLayout().setFloatingDividers(false);
    

または、重みにさらに重みを付けます。(余分な/不足しているスペースの分散のためだけにではなく) レイアウト自体にそれらを使用するように layoutManager に強制します。副作用は、コンプのprefSizeが設定される可能性があることです(レイアウトによって、これは絶対にありませんが、誰が完璧です;-)

   pane.getMulitSplitLayout().setLayoutByWeights(true);

どちらの方法を好むか、またはマルチスプリットでそれを簡単にできるかどうか/どのようにできるかわかりません..

于 2011-08-23T11:50:46.520 に答える