2016-04-27 9 views
1

次の例があります。私が望むのは、パネルの内容がパネルの上部に揃えられていますが、パネルの中央に配置されていることです。 GridBagLayoutをマネージャとして使用し、NORTHへのアンカーを設定することがそのトリックを行うべきだと思いましたが、明らかにそうではありません。いくつかのポイントを明確にしようとパネルのコンテンツをパネルの上部に揃えます。

  • ボタンを保存するには、フレームが
  • 成長し続けると、それが成長し続けるしないようにtextAreaは、最大の高さを持つべきでテキストエリア
  • 直下に残るべき
  • 保存ボタンの幅は固定されている必要があります。

また、フレームの高さが小さすぎると、textAreaは突然1つの行にのみサイズが変更されます。サイズを徐々に縮小したいと思います。

package layouttests; 

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.MouseInfo; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class LayoutTest extends JFrame 
{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public LayoutTest() 
    { 
     setSize(50, 200); 
     setLocation(MouseInfo.getPointerInfo().getLocation()); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.NORTH; 
     JButton okButton = new JButton("Save"); 

     JTextArea textArea = new JTextArea(5,1); 
     textArea.setWrapStyleWord(true); 
     textArea.setLineWrap(true); 
     textArea.setEditable(true); 

     JScrollPane scrollPane = new JScrollPane(textArea); 
     scrollPane.getVerticalScrollBar().setUnitIncrement(10); 

     gbc.anchor = GridBagConstraints.NORTH; 
     gbc.gridy = 0; 
     gbc.weightx = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     panel.add(scrollPane, gbc); 
     gbc.gridy = 1; 
     gbc.fill = GridBagConstraints.NONE; 
     panel.add(okButton, gbc); 
     panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
     add(panel); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 


    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       new LayoutTest(); 

      } 
     }); 
    } 

} 
+1

私は 'gbc.weighty = 1.0;'を呼び出すことはあなたの最初の質問のために働くべきだと思います。編集:スクロールペインを同じ高さのままにしたい場合は、スクロールペインを追加した後に呼び出します。 –

+0

それはありますが、副作用があります:textAreaは私が(高さを意味する)よりも大きくなります。テキスト領域の最大高さを制限するにはどうすればよいですか?これはsetMaximumSizeで何かですか? – Philipp

+0

'gbc.fill = GridBagConstraints.BOTH;'を 'gbc.fill = GridBagConstraints.HORIZONTAL;'( 'weighty'と一緒に)に変更しました – MadProgrammer

答えて

1

私は、同様のアプローチを持っていた基本的にはサイズ制限

public LayoutTest() 
{ 
    setSize(50, 200); 
    setLocation(MouseInfo.getPointerInfo().getLocation()); 

    final JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

    JButton okButton = new JButton("Save"); 
    JPanel wrapper = new JPanel(); 
    wrapper.add(okButton); 

    JTextArea textArea = new JTextArea(5,1); 
    textArea.setWrapStyleWord(true); 
    textArea.setLineWrap(true); 
    textArea.setEditable(true); 

    JScrollPane scrollPane = new JScrollPane(textArea); 
    scrollPane.getVerticalScrollBar().setUnitIncrement(10); 
    scrollPane.setMaximumSize(new Dimension(Short.MAX_VALUE, 150)); 

    panel.add(scrollPane); 
    panel.add(wrapper); 
    panel.add(Box.createVerticalGlue()); 
    panel.setBorder(BorderFactory.createLineBorder(Color.red)); 
    add(panel); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 
+0

これは今のところよく見えます。フレームの高さを上げたときにtextAreaがほとんど成長しない理由を知りましたか?また、それは私ですか、それとももう保存されていない保存ボタンですか? – Philipp

+0

ここで最大の高さを設定できます scrollPane.setMaximumSize(new Dimension(Short.MAX_VALUE、150)); – iestync

+0

ボタンのセンタリングを修正するには、ボタンを直接追加するのではなく、別のパネルを作成してボタンを追加し、このパネルを追加します。 – Berger

2

を含め、何かのような...

gbc.anchor = GridBagConstraints.NORTH; 
gbc.gridy = 0; 
gbc.weightx = 1; 
gbc.weighty = 1; 
gbc.fill = GridBagConstraints.HORIZONTAL; 

がためHow to Use GridBagLayoutを見ているだろう必要があります詳細

関連する問題