将面板内容与面板顶部对齐

Align panel content to the top of panel

我有以下例子。我想要的是面板的内容与面板的顶部对齐,但它在面板的中心对齐。我认为使用 GridBagLayout 作为管理器并将锚点设置为 NORTH 应该可以解决问题,显然它没有。

试图澄清几点:

另外,如果框架在高度方面变得太小,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();

            }
        });
    }

}

我有一个类似的方法,包括大小限制

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);
}

基本上,像...

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

应该

查看How to Use GridBagLayout了解更多详情