2013-02-13 7 views
5

Ich versuche, Komponenten zu einem JPanel hinzufügen, dann dieses Panel in eine JScrollPane, dann legen Sie die JScrollPane in JOptionPane.Warum JScrollPane in JOptionPane nicht seinen gesamten Inhalt zeigt?

Das Problem: nur 19 Zeile von Komponenten hinzugefügt. Es gibt eine For-Schleife, die die Anzahl der Zeilen von Komponenten bestimmt. Wenn Sie den Status-Zähler auf 19 oder weniger ändern, werden alle von ihnen angezeigt.

Dies ist ein SSCCE des Problems

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 für [sscce] (http://sscce.org/); Siehe auch dieses [Q & A] (http://stackoverflow.com/q/10094825/230513). – trashgod

+0

@trashgod Vielen Dank trashgod, aber mein Problem ist nicht "Wie GroupLayout verwendet, um Komponenten iterativ hinzuzufügen". Ich habe sie bereits hinzugefügt, aber nicht alle angezeigt. –

+1

Mehr als 19 hinzugefügt, aber nicht sichtbar im Viewport, können Sie sehen, wenn Sie zu 'neue Dimension (400, 900) wechseln' ' – oliholz

Antwort

9

Wie in dieser verwandten example gezeigt, können Sie die bevorzugte Größe des Ansichtsfenster außer Kraft setzen.

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

Siehe auch dieses verwandte [Beispiel] (http://stackoverflow.com/a/8504753/230513). – trashgod

Verwandte Themen