2016-04-27 75 views
1

我有以下示例。我想要的是面板的內容與面板的頂部對齊,但它會在面板的中心對齊。我認爲使用GridBagLayout作爲管理器並設置到NORTH的錨點應該做到這一點,顯然它不。將面板內容與面板頂部對齊

試圖澄清幾點:

  • 保存按鈕應文本區直屬保持
  • 文本區域應該有一個最大高度,因此不會持續增長的框架保持增長
  • 保存按鈕應該有固定的寬度。

另外,如果frame的高度太小,textArea會突然調整到只有一行,我想讓它逐漸減小它的大小。

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更多詳情