为什么 JOptionPane 中的 JScrollPane 没有显示其所有内容? [英] Why JScrollPane in JOptionPane not showing all its content?

查看:31
本文介绍了为什么 JOptionPane 中的 JScrollPane 没有显示其所有内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将组件添加到 JPanel,然后将此面板放入 JScrollPane,然后将 JScrollPane 放入 JOptionPane.

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

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

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.

这是问题的一个 SSCCE

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

推荐答案

如本相关示例所示,您可以覆盖视口的首选大小.

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

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

这篇关于为什么 JOptionPane 中的 JScrollPane 没有显示其所有内容?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆