Java 调整JOptionDialog的大小以适应其中的内容

Java 调整JOptionDialog的大小以适应其中的内容,java,swing,jlist,joptionpane,Java,Swing,Jlist,Joptionpane,我想为我的项目创建一个对话框。对话框应由两个按钮和一个列表组成。为此,我创建了一个新类,其内容如下: ContentPane/ScrollPane/JList 代码如下: import javax.swing.AbstractListModel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JList; import javax.swing.JPanel

我想为我的项目创建一个对话框。对话框应由两个按钮和一个列表组成。为此,我创建了一个新类,其内容如下:

ContentPane/ScrollPane/JList
代码如下:

import javax.swing.AbstractListModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class testDialog extends JPanel {
    private JScrollPane scrollPane;
    private JList list;

    public testDialog() {
        GroupLayout PanelMain = new GroupLayout(this);
        PanelMain.setHorizontalGroup(
            PanelMain.createParallelGroup(Alignment.LEADING)
                .addGroup(PanelMain.createSequentialGroup()
                    .addComponent(getScrollPane(), GroupLayout.PREFERRED_SIZE, 181, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(21, Short.MAX_VALUE))
        );
        PanelMain.setVerticalGroup(
            PanelMain.createParallelGroup(Alignment.LEADING)
                .addComponent(getScrollPane(), GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE)
        );
        setLayout(PanelMain);
    }

    private JScrollPane getScrollPane() {
        if (scrollPane == null) {
            scrollPane = new JScrollPane();
            scrollPane.setViewportView(getList());
        }
        return scrollPane;
    }
    private JList getList() {
            list = new JList();
            list.setModel(new AbstractListModel() {
                String[] values = new String[] {"data1", "data2", "data3", "data4"};
                public int getSize() {
                    return values.length;
                }
                public Object getElementAt(int index) {
                    return values[index];
                }
            });
        return list;
    }
}
我计划使用另一个类中的
JOptionDialog
调用该类,如下所示:

import javax.swing.JOptionPane;

public class test2 {

    public static void main(String[] args) {
                try {
                    Object[] asd = {"cancel","ok"};
                    JOptionPane.showOptionDialog(null, testDialog.class.newInstance(),"testDialog",JOptionPane.YES_NO_OPTION,JOptionPane.PLAIN_MESSAGE, null,asd,asd[1]);           
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }
此代码运行良好,但结果如下所示:

可以看出,它有相当多的空白,我想删除。我已尝试通过以下方式手动设置大小:

JOptionPane op = new JOptionPane();
op.setSize(400, 400);
op.showOptionDialog(null, testDialog.class.newInstance(),"testDialog",JOptionPane.YES_NO_OPTION,JOptionPane.PLAIN_MESSAGE, null,asd,asd[1]);

但这似乎并不奏效。因此,非常感谢您的帮助。

您可以通过拨打电话来确定高度。宽度(通常)最好保留为自然尺寸,而不是在布局中建议首选尺寸时固有的猜测工作


请学习常见的Java命名法(命名约定-例如,
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是一个
大写常量
),并始终如一地使用它。2) 为了更快地获得更好的帮助,请发布一个or。安德鲁谢谢你的回复,但这不是我所说的空间。编辑我的帖子“…那不是我所说的空间…”让代码来说话。发布一个MCVE!
import javax.swing.*;

public class WellFitList {

    WellFitList() {
        initUI();
    }

    public void initUI() {
        String[] data = {"Data 1", "Data 2", "Data 3", "Data 4"};
        JList list = new JList(data);
        list.setVisibleRowCount(data.length);

        JOptionPane.showMessageDialog(null, new JScrollPane(list));
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                WellFitList o = new WellFitList();
            }
        };
        SwingUtilities.invokeLater(r);
    }
}