Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why JScrollPane in JOptionPane not showing all its content?

I am trying to add components to a JPanel, then put this panel into a JScrollPane, then put the JScrollPane in JOptionPane.

The problem: only 19 line of components added. There is a for-loop that determine the number of lines of components, if you change the condition counter to 19 or less then all of them will be displayed.

This is an SSCCE of the problem

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();
    }
}
like image 473
Saleh Feek Avatar asked Feb 13 '13 15:02

Saleh Feek


1 Answers

As shown in this related example, you can override the viewport's preferred size.

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);
            }
        });
    }
}
like image 59
trashgod Avatar answered Sep 28 '22 02:09

trashgod