2017-11-20 6 views
0

私はJScrollPaneのを持っている(JSplitPaneのをwithing JTabbedPaneのをwithingされていますが、私はそれが違いを作るとは思わない)GridBagLayoutのと別のパネルが含まれています。内側の要素のサイズに応じてパネルのサイズを設定しますか?

私が欲しいのは簡単です:ScrollPaneのサイズが小さすぎる場合は、すべての要素が見えるように垂直スクロールバーを表示してください。悲しいことに

int prefSize = lastButton.getLocationOnScreen().y + lastButton.getSize().height - myGridPanel.getLocationOnScreen().y; 
myGridPanel.setPreferredSize(new Dimension(400, prefSize)); 

、これだけ作品:それを達成するために、私は高さを追加し、最後の要素の位置を取り、はパネル自体のオフセットsubstracts ComponentListener.componentResizedのための簡単な関数を書きましたの後私は手動でウィンドウのサイズを変更します。その前に、スクロールバーは最後まで到達しないので、いくつかの行に到達できず、一番上のJTextPane要素の一部が隠されます。私が言ったように、ウィンドウのサイズを変更すると(垂直または水平にサイズを増減する)、すべての要素は正しいので、スクロールバーも最後の要素の後まで正確にスクロールします。

私は、フレームを作成したり、タブに切り替える場合は、次のを追加することにより、(のstateChanged())の状況を改善することができました:

mainFrame.pack(); 
setPreferredSize(); 
mainFrame.setSize(dim); 
mainFrame.revalidate(); 
mainFrame.repaint(); 

は今、最後のものを除くすべての行がスクロールされ、最後の行は〜30%しか表示されません。繰り返しますが...手動でフレームのサイズを変更すると、すべてが意図どおりに見えます。

シンプルなものが欠けているように感じますが、何ができるのかわかりません。私の周りを検索すると、追加の提案を見たsetPreferredSize(panel.getPreferredSize());でも、それは役に立たなかった。

私はこれに関する助けに感謝します!

ありがとうございます!

答えて

1

私は、setPreferredSize(panel.getPreferredSize())を追加することを提案しました。 、

間違っています。パネルのサイズを決して管理しないでください。それがレイアウトマネージャの仕事です。 setPreferredSize()を使用しないでください!

レイアウトマネージャにジョブをさせると、レイアウトマネージャは自動的に優先サイズを計算し、必要に応じてスクロールバーが自動的に表示されます。

私はコンポーネントリスナーを使用する必要はありませんComponentListener.componentResized

のための簡単な関数を書きました。

スクロールペインの一般的な使い方は、それをフレームのBorderLayoutのCENTERに追加することです。次に、フレームのサイズが変更されると、スクロールペインのサイズが変更されます。スクロールバーは必要に応じて表示/非表示になります。

+0

ええと、それは素晴らしいと思うけど、それでも私は全く役に立たない*。私は 'BorderLayout'、' BoxLayout'などを試しましたが、 'GridBagLayout'がなくてもレイアウトを動作させる方法はわかりません。そして、これは、 'setPreferredSize()'関連のものを除外すると、確かに動作しません。 – Markstar

+0

@Markstar、よく、あなたが質問するときは、問題を示す適切な[mcve]を含める必要があります。あなたが私のアドバイスに従えば、それはうまくいくでしょう。私たちはあなたがそれが働かないようにするために何をしているのか推測できません。 – camickr

+0

はい、わかっています。私は、私が見落とした単純なことがあると思っていた。私が言ったように、 'BorderLayout'を使うことはできません。なぜなら、テキスト要素が正しく改ざんされず(改行などで)ネスティングも機能しないからです。最小限の例を試すことができるかどうかがわかります。 – Markstar

関連する問題