我需要在添加新组件时动态调整JPanel的大小

我需要让用户向我的JFrame添加更多文本字段,这样一旦框架的大小超过其原始值,滚动窗格就会介入。由于我无法将JScrollPane添加到JFrame以便启用滚动我决定将JPanel置于其上JFrame并将JPanel对象传递给JScrollPane构造函数。 滚动现在可以正常工作,但只能到达JPanel的边框。 事情是JPanel的大小保持原样,并没有动态扩展。 发生的事情是我的代码中的按钮占用了JPanel的大小为300×300的所有空间,但我想要做的是在这些控件耗尽其原始空间后让JPanel拉伸。 请指教。

import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Rectangle; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ScrollPaneConstants; public class Skrol { public static void main(String[] args) { JFrame f = new JFrame(); f.setLayout(new FlowLayout()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setPreferredSize(new Dimension(400,400)); JScrollPane jsp = new JScrollPane(p); jsp.setPreferredSize(new Dimension(300,300)); jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); for(int i=0;i<100;i++) { JButton b = new JButton("Button "+i); p.add(b); } f.add(jsp); f.setSize(new Dimension(600,600)); f.setLocation(300, 300); f.setVisible(true); } } 

我将JPanel的布局更改为GridLayout ,因此布局管理器的大小只是handeld,具体取决于面板上的组件。

  JFrame f = new JFrame(); f.setLayout(new BorderLayout()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(new GridLayout(0, 5)); JScrollPane jsp = new JScrollPane(p); jsp.setPreferredSize(new Dimension(300,300)); jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); for (int i = 0; i < 100; i++) { JButton b = new JButton("Button " + i); p.add(b); } f.add(jsp, BorderLayout.CENTER); f.setLocation(300, 300); f.setVisible(true); f.pack();