为什么JOptionPane中的JScrollPane没有显示所有的内容?

我试图添加组件到一个JPanel,然后把这个面板到一个JScrollPane,然后把JScrollPane放在JOptionPane中。

问题是:只添加了19行组件。 有一个确定组件行数的for循环,如果将条件计数器更改为19或更less,则将显示所有组件的行数。

这是问题的SSCCE

import java.awt.Dimension; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; public class DynamicGroupLayout extends JPanel { JButton addRecordButton; JTextField[] FieldsArray; JLabel[] LabelsArray; GroupLayout layout; JScrollPane scrollPane; public DynamicGroupLayout() { addRecordButton = new JButton("add record"); layout = new GroupLayout(this); this.setLayout(layout); layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); scrollPane = new JScrollPane(this); scrollPane.getVerticalScrollBar().setUnitIncrement(16); scrollPane.setPreferredSize(this.getPreferredSize()); setTextFields(); showDialog(); } @Override public Dimension getPreferredSize() { return new Dimension(400, 500); } private void setTextFields() { int num = 30; //If 19 or less, all components shown. String[] labelsNames = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30" }; FieldsArray = new JTextField[num]; LabelsArray = new JLabel[num]; GroupLayout.ParallelGroup parallelGroupHoriz = layout.createParallelGroup(); layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(parallelGroupHoriz)); for (int i = 0; i < num; i++) { System.out.println(i); LabelsArray[i] = new JLabel(labelsNames[i]); FieldsArray[i] = new JTextField(10); FieldsArray[i].setMaximumSize(new Dimension(200, 3)); LabelsArray[i].setLabelFor(FieldsArray[i]); parallelGroupHoriz.addGroup(layout.createSequentialGroup() .addComponent(LabelsArray[i]) .addComponent(FieldsArray[i])); } parallelGroupHoriz.addComponent(addRecordButton, GroupLayout.Alignment.CENTER); GroupLayout.SequentialGroup sequentialGroupVert = layout.createSequentialGroup(); layout.setVerticalGroup(sequentialGroupVert); for (int i = 0; i < num; i++) { sequentialGroupVert.addGroup(layout.createParallelGroup(). addComponent(LabelsArray[i]) .addComponent(FieldsArray[i])); } sequentialGroupVert.addComponent(addRecordButton); for (int i = 0; i < num; i++) { layout.linkSize(SwingConstants.HORIZONTAL, LabelsArray[i], LabelsArray[0]); } } private void showDialog() { JOptionPane.showOptionDialog(null, scrollPane, "Update data", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, null); } public static void main(String[] args) { DynamicGroupLayout d = new DynamicGroupLayout(); } } 

如此相关示例所示,您可以覆盖视口的首选大小。

在这里输入图像描述

 import java.awt.Dimension; import java.awt.EventQueue; import javax.swing.GroupLayout; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; /** * @see https://stackoverflow.com/a/14858272/230513 * @see https://stackoverflow.com/a/8504753/230513 * @see https://stackoverflow.com/a/14011536/230513 */ public class DynamicGroupLayout { private static final int NUM = 30; private JTextField[] fields = new JTextField[NUM]; private JLabel[] labels = new JLabel[NUM]; private JPanel create() { JPanel panel = new JPanel(); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); GroupLayout.ParallelGroup parallel = layout.createParallelGroup(); layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(parallel)); GroupLayout.SequentialGroup sequential = layout.createSequentialGroup(); layout.setVerticalGroup(sequential); for (int i = 0; i < NUM; i++) { labels[i] = new JLabel(String.valueOf(i + 1), JLabel.RIGHT); fields[i] = new JTextField(String.valueOf("String " + (i + 1))); labels[i].setLabelFor(fields[i]); parallel.addGroup(layout.createSequentialGroup(). addComponent(labels[i]).addComponent(fields[i])); sequential.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE). addComponent(labels[i]).addComponent(fields[i])); layout.linkSize(SwingConstants.HORIZONTAL, labels[i], labels[0]); } return panel; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { final JPanel panel = new DynamicGroupLayout().create(); JScrollPane jsp = new JScrollPane(panel) { @Override public Dimension getPreferredSize() { return new Dimension(320, 240); } }; JOptionPane.showMessageDialog(null, jsp, "Data", JOptionPane.PLAIN_MESSAGE); } }); } }