2013-02-13 87 views
5

我想将组件添加到JPanel,然后将此面板放入JScrollPane,然后将JScrollPane放入JOptionPane中。为什么JOptionPane中的JScrollPane没有显示其所有内容?

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

这是问题

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(); 
    } 
} 
+2

1为[SSCCE](http://sscce.org/);另请参阅此[问与答](http://stackoverflow.com/q/10094825/230513)。 – trashgod 2013-02-13 15:50:55

+0

@trashgod谢谢trashgod,但我的问题是不是“如何使用GroupLayout迭代添加组件”。我已经添加了它们,但并非全部都显示出来。 – 2013-02-13 16:01:02

+1

添加了19个以上但在视口中不可见,您可以查看是否更改为'返回新尺寸(400,900)' – oliholz 2013-02-13 16:02:04

回答

9

如该相关example所示的SSCCE,您可以覆盖视口的首选大小。

enter image description here

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

另请参阅此相关的[示例](http://stackoverflow.com/a/8504753/230513)。 – trashgod 2013-02-14 16:40:40

相关问题