2013-02-13 10 views
5

Próbuję dodać komponenty do JPanel, następnie umieścić ten panel w JScrollPane, a następnie umieścić JScrollPane w JOptionPane.Dlaczego JScrollPane w JOptionPane nie pokazuje całej zawartości?

Problem: dodano tylko 19 linii komponentów. Istnieje pętla for, która określa liczbę linii komponentów, jeśli zmienisz licznik warunków na 19 lub mniej, wszystkie zostaną wyświetlone.

To SSCCE problemu

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 do [sscce] (http://sscce.org/); zobacz także [Q & A] (http://stackoverflow.com/q/10094825/230513). – trashgod

+0

@trashgod Dziękuję trashgod, ale moim problemem nie jest "Jak używać GroupLayout do iteracyjnego dodawania komponentów". Już je dodałem, ale nie wszystkie są wyświetlane. –

+1

Więcej niż 19 jest dodawanych, ale niewidocznych w podglądzie, możesz zobaczyć, czy zmienisz na 'return new Dimension (400, 900)' – oliholz

Odpowiedz

9

jak pokazano w tym powiązanej example można przesłonić rzutni preferowany rozmiar.

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

Zobacz także ten powiązany [przykład] (http://stackoverflow.com/a/8504753/230513). – trashgod

Powiązane problemy