0

高さが増減するJScrollPaneを含むを作成しようとしています。JPanelのサイズよりも大きくなるとJScrollPane、全体をスクロールできる垂直スクロール バーが作成されますJPanel。しかし、私はこれを達成するのに苦労しています。はい、LayoutManagers を使用していないことはわかっています。いいえ、私はそれらを使用しません。それらの使用を伴わない解決策が必要です。

AbstractActionに加算および減算する2 つのボタンを次に示しますJPanel

class AddACT extends AbstractAction
    {
      public void actionPerformed(ActionEvent e)
      {
        info.setSize(420,info.getHeight() + 40);
        info.add(new SubPanel); // Adds another JPanel into the main JPanel (for content input)
        gui.repaint();
        infoS.validate();
      }
    }

class RemoveACT extends AbstractAction
    {
      public void actionPerformed(ActionEvent e)
      {
        info.remove(subPanel()); // This would remove the last JPanel added to the main JPanel
        info.setSize(420,info.getHeight() - 40);
        gui.repaint();
        infoS.validate();
      }

メインの JPanel と JScrollPane のコードは次のとおりです。

final JPanel info = new JPanel();
final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);  
info.setLayout(null);
info.setSize(420,600);
infoS.setLocation(10,80);
infoS.setSize(420,490);
gui.add(infoS); // gui is the frame's content pane (the overall JPanel)

これは、私が GUI を学ぼうとしている 2 番目のプロジェクトです。私は Swing の完全な初心者であり、Java は中級者です。私が盲目的に明らかな間違いを犯している場合は申し訳ありません。

4

2 に答える 2

6

1) LayoutManagers (@kleopatra と @GagandeepBali のコメントに +1 ) を使用する

sがないことはLayoutManager、GUI が非常に見栄えが悪いことを保証するだけであり (特に、他の OS/ビルドで実行する場合)、初心者であることは、間違った方法を学んで呼び出しsetSize()などの悪い習慣を身につけるよりも、正しい方法を学ぶべきです。

開始するには、次のリンクを参照してください。

2)の使用方法については、この例を参照してください。これは、ボタン付きの を に追加し、次に に追加するJScrollPaneだけです。JPanelJScrollPaneJFrame

3) 垂直スクロールのみを可能にする方法については、この例も参照してください。JScrollPane

4) 詳細についてJScrollPaneは、こちらをご覧ください:スクロール ペインの使用方法

5) との相互作用については、スクロール ペインでLayoutManagerサイズを明示的に設定しない場合setPreferredSize(Dimension d) 、9 つのコンポーネント (ビューポート、および存在する場合は 2 つのスクロール バー、行と列) の優先サイズに基づいて計算されます。ヘッダー、四隅)

6) の使用についてvalidate():

  • validate()新しいJComponentが可視コンポーネントに追加されるときに使用されます

  • revalidate()JComponent可視コンポーネントから削除/追加するときに使用されます

  • revalidate()カバーvalidate()

したがって、常にこれを使用します。

//add or remove component(s)
revalidate();
repaint();

参考文献:

于 2012-11-20T17:57:15.217 に答える
1

LayoutManager問題を解決する必要はありません。Thrfoot の例の問題は、次の行にあります。

final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);  
info.setLayout(null);
info.setSize(420,600);

プログラムはスクロール バーが必要であることを認識しているように見えますが (設定が の場合はスクロール バーが表示されますVERTICAL_SCROLLBAR_AS_NEEDED)、実際のスクロールは機能しません (スクロール バー スライダーはありません)。

これを修正するには、まずの適切なサイズを設定してからinfo構築しinfoSます。

例:

info.setPreferredSize(420,600);
final JScrollPane infoS = new JScrollPane(info, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

アイデアは、スクロール ペインに使用するinfoに、パネルの適切なサイズを設定することです。これは、に追加する前にのサイズと場所を設定するのと同じ理由です。infoSgui

infoS.setLocation(10,80);
infoS.setSize(420,490);
gui.add(infoS); // gui is the frame's content pane (the overall JPanel)
于 2013-04-09T21:38:16.207 に答える