Java 使用滚动条动态显示面板的布局

Java 使用滚动条动态显示面板的布局,java,swing,jscrollpane,layout-manager,Java,Swing,Jscrollpane,Layout Manager,在java中,我一直在尝试创建一个面板,该面板可以接受带有滚动条的其他面板 我试着使用gridlayout,效果很好,只是如果我只添加几个面板,它会将这些面板增大到适合父面板的大小 我尝试使用flowlayout,但这会使面板水平流动,因为有一个滚动条 如何制作面板,以便可以从顶部开始将面板添加到父面板,并使它们始终保持相同大小(或其首选大小) 此外,当我在事件后将面板添加到父面板时,它们在我移动或调整窗体大小后才会显示。我如何使它重新油漆?对其调用repaint()无效。假设,请参阅。为方便起

在java中,我一直在尝试创建一个面板,该面板可以接受带有滚动条的其他面板

我试着使用gridlayout,效果很好,只是如果我只添加几个面板,它会将这些面板增大到适合父面板的大小

我尝试使用flowlayout,但这会使面板水平流动,因为有一个滚动条

如何制作面板,以便可以从顶部开始将面板添加到父面板,并使它们始终保持相同大小(或其首选大小)

此外,当我在事件后将面板添加到父面板时,它们在我移动或调整窗体大小后才会显示。我如何使它重新油漆?对其调用repaint()无效。

假设,请参阅。为方便起见,
可滚动
客户端,如offer,但您始终可以明确设置视口的大小。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

/** This lays out components in a column that is constrained to the
top of an area, like the entries in a list or table.  It uses a GridLayout
for the main components, thus ensuring they are each of the same size.
For variable height components, a BoxLayout would be better. */
class ConstrainedGrid {

    ConstrainedGrid() {
        final JPanel gui = new JPanel(new BorderLayout(5,5));
        gui.setBorder(new EmptyBorder(3,3,3,3));
        gui.setBackground(Color.red);

        JPanel scrollPanel = new JPanel(new BorderLayout(2,2));
        scrollPanel.setBackground(Color.green);
        scrollPanel.add(new JLabel("Center"), BorderLayout.CENTER);
        gui.add(new JScrollPane(scrollPanel), BorderLayout.CENTER);

        final JPanel componentPanel = new JPanel(new GridLayout(0,1,3,3));
        componentPanel.setBackground(Color.orange);
        scrollPanel.add(componentPanel, BorderLayout.NORTH);

        JButton add = new JButton("Add");
        gui.add(add, BorderLayout.NORTH);
        add.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                componentPanel.add(new JTextField());
                gui.validate();
            }
        });

        Dimension d = gui.getPreferredSize();
        d = new Dimension(d.width, d.height+100);
        gui.setPreferredSize(d);

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ConstrainedGrid cg = new ConstrainedGrid();
            }
        });
    }
}

+1用于
BoxLayout
,用于。