设置JDialog的最大大小?

Ele*_*hoy 4 java swing jdialog

简短的版本:我需要做一些棘手的事情来让JDialog的setMaximumSize()起作用吗?

完整版:我有一个JDialog(布局管理器:BorderLayout),它包含一个滚动窗格和底部带有提交按钮的JPanel.

滚动窗格包含一个JPanel,它在系统的其他位置动态构建.

我想要的是对话框在JPanel周围动态调整大小到一定大小,然后开始增长滚动条.这或多或少是默认情况下发生的事情,除了最大尺寸似乎是我的显示器的大小.

认为这是从java.awt.Component继承的.setMaximumSize()方法,但设置它似乎没有任何影响.

设置首选大小确实有效 - 但是无论如何,对话框总是那么大,这实际上并不是我想要的.

(如果我在滚动窗格上设置最大/首选大小属性,效果是相同的.)

我错过了一些非常明显的东西吗?是否有一些我不知道的古怪的JDialog/BorderLayout/MaximumSize交互?

tra*_*god 9

调整滚动窗格大小中所述,某些组件可以提供有关设置视口的首选大小的有用信息.该setVisibleRowCount()方法JList特别方便,但甚至getViewport().setPreferredSize(…)可能就足够了.当然,sscce会有所帮助.

附录:作为一个具体的例子,下面的对话框最初的大小为N -2行.随着越来越多的被添加,该对话框增长,直到数量达到Ñ.此时,滚动条开始"增长".该示例使用a JList,但任何Scrollable组件都应该是可适应的.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/** @see http://stackoverflow.com/questions/5759131 */
public class ListDialog {

    private static final int N = 12;
    private JDialog dlg = new JDialog();
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JScrollPane sp = new JScrollPane(list);
    private int count;

    public ListDialog() {
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add") {

            @Override
            public void actionPerformed(ActionEvent e) {
                append();
                if (count <= N) {
                    list.setVisibleRowCount(count);
                    dlg.pack();
                }
            }
        }));
        for (int i = 0; i < N - 2; i++) {
            this.append();
        }
        list.setVisibleRowCount(N - 2);
        dlg.add(sp, BorderLayout.CENTER);
        dlg.add(panel, BorderLayout.SOUTH);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    private void append() {
        model.addElement("String " + String.valueOf(++count));
        list.ensureIndexIsVisible(count - 1);
    }

    public static void main(String[] a_args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ListDialog pd = new ListDialog();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


kle*_*tra 5

使面板imlement Scrollable是要走路.另请参阅(除了已提供的Trashgod教程链接)Rob的博客条目

http://tips4java.wordpress.com/2009/12/20/scrollable-panel/

然后:

1)以典型内容合理的方式实现getPreferredScrollableViewportSize()(对于要显示的首选行数的JList fi,也就是:visibleRowCount)
2)为那些"合理的术语"实现setter/getters

这个附加层(协调"合理的术语")允许所有协作组件尽最大努力提出强大的大小提示,而不会像setXXSize那样产生不友好的干扰(这是一个不容忽视的,只是忘记那些方法存在;)