2013-02-13 33 views
5

Tôi đang cố gắng thêm các thành phần vào một JPanel, sau đó đặt bảng này vào một JScrollPane, sau đó đặt JScrollPane trong JOptionPane.Tại sao JScrollPane trong JOptionPane không hiển thị tất cả nội dung của nó?

Vấn đề: chỉ 19 dòng thành phần được thêm vào. Có một vòng lặp cho phép xác định số dòng của các thành phần, nếu bạn thay đổi bộ đếm điều kiện thành 19 hoặc ít hơn thì tất cả chúng sẽ được hiển thị.

Đây là một SSCCE của vấn đề

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 cho [sscce] (http://sscce.org/); xem thêm [Hỏi đáp] này (http://stackoverflow.com/q/10094825/230513). – trashgod

+0

@trashgod Cảm ơn bạn thùng rác, nhưng vấn đề của tôi là Không "Cách sử dụng GroupLayout để thêm thành phần lặp đi lặp lại". Tôi đã thêm chúng, nhưng không phải tất cả chúng được hiển thị. –

+1

Hơn 19 được thêm nhưng không hiển thị trong khung nhìn, bạn có thể thấy nếu bạn thay đổi thành 'return new Dimension (400, 900)' – oliholz

Trả lời

9

Như thể hiện trong liên quan example này, bạn có thể ghi đè lên kích thước ưa thích của khung nhìn.

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

Xem thêm [ví dụ] có liên quan này (http://stackoverflow.com/a/8504753/230513). – trashgod

Các vấn đề liên quan