2012-02-09 1 views
3

私は複数のパネルを持つアプリケーションを持っています。私は、異なるパネルの異なるレイアウトマネージャを自由に使用したいと思っていますが、ユーザがウィンドウのサイズを変更するのと同じように動作させたいと思います。GridBagLayoutを使用するこれらの3つのパネルで余分なスペースを使い分ける方法と、それらを一様にする方法

package example; 

    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 

    import javax.swing.BoxLayout; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTabbedPane; 
    import javax.swing.JTextField; 

    public class TP1 extends JFrame 
    { 
     public static void main(String[] args) 
     { 
      TP1 tp1 = new TP1(); 
      tp1.go(); 
     } 

     public void go() 
     { 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 

      // create a panel with some labels on it 
      JPanel innerFirst = new JPanel(); 
      innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS)); 
      innerFirst.add(new JLabel("one")); 
      innerFirst.add(new JLabel("two")); 
      innerFirst.add(new JLabel("three")); 
      innerFirst.add(new JLabel("four")); 

      // put that panel in a scroll pane 
      JScrollPane firstSP = new JScrollPane(innerFirst); 

      // make another panel and put our scrolled panel in it 
      JPanel outerFirst = new JPanel(); 
      outerFirst.setLayout(new BoxLayout(outerFirst, BoxLayout.PAGE_AXIS)); 
      outerFirst.add(firstSP); 

      // create a GridBagLayout panel with some text fields on it 
      JPanel innerSecond = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.weightx = .25; 
      gbc.anchor = GridBagConstraints.LINE_START; 
      innerSecond.add(new JTextField(8), gbc); 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      innerSecond.add(new JTextField(10), gbc); 
      gbc.gridx =0; 
      gbc.gridy = 2; 
      innerSecond.add(new JTextField(12), gbc); 

      // put that panel in a scroll pane 
      JScrollPane secondSP = new JScrollPane(innerSecond); 

      // make another panel and put our second scrolled panel in it 
      JPanel outerSecond = new JPanel(); 
      outerSecond.setLayout(new BoxLayout(outerSecond, BoxLayout.LINE_AXIS)); 
      outerSecond.add(secondSP); 

      JPanel innerThird = new JPanel(new GridBagLayout()); 
      GridBagConstraints gbc3 = new GridBagConstraints(); 
      gbc3.anchor = GridBagConstraints.LINE_END; 
      gbc.weightx = .25; 
      gbc3.gridx = 0; 
      gbc3.gridy = 0; 
      innerThird.add(new JLabel("1st label"), gbc3); 
      gbc3.gridy = 1; 
      innerThird.add(new JLabel("second label"), gbc3); 
      gbc3.gridy = 2; 
      innerThird.add(new JLabel("IIIrd label"), gbc3); 

      gbc3.anchor = GridBagConstraints.LINE_START; 
      gbc3.gridx = 1; 
      gbc3.gridy = 0; 
      innerThird.add(new JTextField(8), gbc3); 
      gbc3.gridy = 1; 
      innerThird.add(new JTextField(12), gbc3); 
      gbc3.gridy = 2; 
      innerThird.add(new JTextField(14), gbc3); 

      JScrollPane thirdSP = new JScrollPane(innerThird); 
      JPanel outerThird = new JPanel(); 
      outerThird.setLayout(new BoxLayout(outerThird, BoxLayout.LINE_AXIS)); 
      outerThird.add(thirdSP); 

      // put the scrolled panes onto a tabbed pane 
      JTabbedPane tp = new JTabbedPane(); 
      tp.add("text fields", outerSecond); 
      tp.add("labels", outerFirst); 
      tp.add("mixed", outerThird); 

      // add the tabbed pane to the frame 
      this.add(tp); 

      // pack it and ship it. 
      pack(); 
      setVisible(true); 
     } 
    } 

上記のコードを実行すると、3つのタブがあるタブ付きウィンドウが表示されます。ウィンドウを小さくすると、すべてのウィンドウにスクロールバーが表示されます。大きなものを作成すると、3つの動作が異なります。ラベルの付いたタブはウィンドウの左上にのみ表示され、フィールドのあるタブは左端に垂直に配置され、グリッドバッグにはラベルとフィールドが混在します拡大されたウィンドウ内にそれらを水平および垂直の両方に配置します。

これはアプリケーションでは受け入れられません。このようにすべてのパネルを同じように動作させる必要があります。私はスクロールバーを持つためにそれらをすべて必要とし、ウィンドウが内部パネルよりも大きくなると、それらのすべてを左上に保持したいと思います。

もう1つの要件:私のタブはJPanelを拡張するもので占有されていますが、JScrollPaneを直接タブに配置する前に私は言いましたが、私のアプリケーションではそうしたくありません。それは他のものを必要以上に複雑にするだけです。

これらの3つの状況が異なる動作をしている理由を理解することを大変嬉しく思っています。私は、左右の例をコピーし、試行錯誤して仕事をするまでは、私たちがやっていることの背後にある原則を理解すれば、私たちはもっと良くなると考えています。

(ちなみに、私は左上に引き寄せているように見えるんGroupLayoutパネルを持っているが、それは私の質問のために必要だったとは思いませんでしたし、それがあるとして、これはコードの100行である。)

答えて

2

あなたのコードでこのようなことが起こっている理由を理解するためには、特定の用語を理解する必要があります。たとえば、PAGE_AXIS、LINE_AXIS、LINE_END、LINE_STARTなどです。

innerFirst.setLayout(new BoxLayout(innerFirst, BoxLayout.PAGE_AXIS)); 

をここでは、コンポーネントの追加を開始するためにあなたのBoxLayoutを伝える:あなたが書き込みなどのように、これらは、コンテナとその出発点に追加されたコンポーネントの向きを説明するものです、制約としてそれらを提供しているので、ページの開始を指すポイントから。 (メモ帳を起動すると、カーソルは新しい文書のPAGE_AXISに置かれます)。しかし、これを書いているとき:

ここで、用語アンカーは、コンポーネントが表示領域より小さいときに使用されます。表示領域内でコンポーネントを配置する場所を決定します。しかし、あなたはそれが意味値LINE_START持っていることを言及し、ここで以来:あなたが作成した理由を3 JTextFields

Place the component centered along the edge of its display area where lines of text 
would normally begin for the current ComponentOrientation. Equal to WEST for horizontal, 
left-to-right orientations and EAST for horizontal, right-to-left orientations. 

を、あなたは左側に中央でそれらを参照してください。

+0

別のバージョンを投稿しているはずです.LINE_STARTとFIRST_LINE_STARTを使って試しました。その場所、およびそれはラベルの位置を変更しません。 FIRST_LINE_STARTは、私が後にあるように物を左上隅に配置することになっていますが、何らかの理由でここにはありません。なぜ誰が知っていますか? – arcy

+0

@rcook:gbc.weighty = 0.1のようなものを追加してみてください。次に、物事を行う、それは場所を変更します。 –

+0

さて、それは物事を変えました - 3つのテキストフィールドがパネル全体に垂直に広がっています。ラベルを貼り付ける方法はありますか?私はまだラベルが違うふうに振る舞っているのだろうと思っています。 – arcy

2

が、私はまだ我々は我々がやっていることの後ろの原則を理解している場合、我々はすべての方が良いだろうと信じて、

を実施例および様々なレイアウトマネージャの説明についてはA Visual Guide to Layout Managersを参照してください。特定のレイアウトマネージャにさまざまな制約がどのように使用されているかを知る必要があります。

+0

私はビジュアルガイド、およびOracle/Sun/Java Swingチュートリアルの他のほとんどの部分を読んでいます。それは良い紹介です。そして私は、さまざまな制約がどのように使われているかを知る必要があることに同意します、それは私がやろうとしていることです。これをカバーするものは何も見つかりませんでした。 「このような状況では、私たちは垂直に中心を置き、左に正当化し、この中で左と正当な正当化を行い、これを縦横に集中させます。それぞれ1つずつ持っています。 – arcy

+0

FlowLayoutは、レイアウトマネージャの配置プロパティに応じて左/中央/右に整列させることができます。BoxLayoutの場合、横方向に同じことができます/ veritically layout components。次に、垂直レイアウト内で、コンポーネントのalignementX値に応じて、コンポーネントをleft/center/rightに水平に整列させることができます。GridBagLayoutを使用すると、 1つのレイアウトマネージャを作業して理解してください。 – camickr

関連する問題