3

私は2つのJSplitPanesを持っています

splitPaneRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, console, tabPager);
splitPaneLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, infoPanel, splitPaneRight);

splitPaneRight.setResizeWeight(1);

メソッドは次のようになり、通常は別の場所で JMenuItem をクリックすることによって呼び出されます。

public void resetLayout()
{
    setSize(1280, 720);
    splitPaneLeft.setDividerLocation(165);
    splitPaneRight.setDividerLocation(830);
}

インターフェイスは次のようになります (クリック可能なサムネイル)。

メイン ユーザー インターフェイス http://bit-stab.com/pictures/dump/MinecraftRemoteAdmin_thumb.jpg

私の問題は、両方の仕切りの位置を移動するたびに、両方の仕切りが元の位置に戻る前に、そのメニュー項目を 2 回押す必要があることです。最初は常に左が、2 回目は右が続きます。

仕切りが設定されている順序を変更しようとしました (最初に右、次に左)。変更された分割線の分割ペイン、両方の分割ペイン、および両方の分割ペインと UI (JFrame を拡張) を無効にしてみました

また、メニュー項目が押されたときにメソッドを 2 回実行しようとしました。または、 getDividerLocation() が設定したばかりの値を返すかどうかを確認します (これは奇妙な理由で行われます)。

最後になりましたが、上記のすべての組み合わせを試しました。

アイデアが不足しています。これに対する有効な修正はありますか?

編集: 実行可能な例を作成しました (ソース: http://pastebin.com/VKtN6zJZ )、download.jar

4

1 に答える 1

2
setSize(1280, 720);

そのようなサイズをハードコーディングしないでください。誰もが同じ解像度のモニターを使用しているわけではありません。多分使用:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

または Toolkit クラスを使用して、ウィンドウの境界を取得します。

このsetDividerLocation( double )メソッドは、「実現された」フレームでのみ機能します。つまり、呼び出した後、pack()またはsetVisible(true)フレームで機能します。

または、コードを でラップしSwingUtilities.invokeLater()て、コードが適切な順序で実行されるようにする必要があります。何かのようなもの

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        splitPaneLeft.setDividerLocation(165);
        splitPaneRight.setDividerLocation(830);
    }
});

それがうまくいかない場合は、おそらく各ステートメントを個別の invokeLater() で実行する必要があります。

仕切りの位置についての同じコメント。値をハードコーディングしないでください。setDividerLocation(.25f)おそらく、絶対値ではなくパーセンテージでサイズを割り当てるメソッドを使用できます。

于 2013-12-16T23:29:15.497 に答える