4

私のGUIアプリケーションには、プログラムの実行中のさまざまな時点でインスタンス化されるいくつかのJPanelがあり、特定のアクションにより、そのうちの1つがスクロールペインに表示されます。

mViewport.setViewportView(currentPanel);

問題は、私のパネルがグリッドバッグレイアウトを使用して行われていることです。その動作は、パネルが内部にあるJScrollPane内の中央に配置されることです。これにより、GUIが奇妙に見えます。

グリッドバッグレイアウトパネルを強制的に左上に揃える方法を知っている人はいますか?

ありがとう!


編集

ここでは、パネル内のコンポーネントではなく、スクロールペイン内のパネル全体の配置について質問していることに注意してください。

4

2 に答える 2

8

GridBagConstraintsパネル内の 1 つ以上のコンポーネントに( で) 重みを設定する必要があります。これには、コンポーネントを「押して」使用可能なスペースをより多く占有する効果があります (重みがないと、コンポーネントは必要なものだけを占有し、パネルは使用可能なスペースの中央に配置されます)。

コンポーネントをスクロール ペインの左上に揃えたい場合は、一番下のコンポーネントの y の重みを 1.0 に設定し、一番右のコンポーネントの x の重みを 1.0 に設定します。

于 2010-01-20T11:16:05.520 に答える
6

いくつかいじった後、私は自分の質問に対する解決策を見つけました:

JPanelウェイトを設定すると、が使用された内のコンポーネントの位置合わせに影響を与えることができるようGridBagLayoutです。JPanelただし、内のの配置には影響しませんでしたJScrollPane

以前のコードで行っていたように、 をの中に直接入れないという、かなり単純な解決策を見つけました。JPanelJScrollPane

if (currentPanel != mCurrentPanel)
{
    mViewport.setViewportView(currentPanel);
}

...しかし、代わりに「外側」JPanelを の中に入れ、JScrollPaneそれを使用するように設定しますFlowLayout。次に、パネルを切り替えたいときは、古いパネルを取り外して、パネルを「外側」パネル内に配置します。

if (currentPanel != mCurrentPanel)
{
    if (mCurrentPanel != null)
    {
        mOuterPanel.remove(mCurrentPanel);
    }
    mCurrentPanel = currentPanel;
    mOuterPanel.add(mCurrentPanel);
}

このアプローチは、私が持っていた多くのパネルのそれぞれではなく、1 つのクラスに変更を加えるだけでよいことを意味したため、かなりうまく機能しました。

于 2010-01-20T23:28:24.827 に答える