设置JDialog的最大大小?

时间:2011-04-22 19:18:01

标签: java swing jdialog

简短版本:我是否需要做一些棘手的工作才能让JDialog的setMaximumSize()工作?

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

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

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

想到这是从java.awt.Component继承的.setMaximumSize()方法,但设置它似乎没有任何效果。

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

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

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

4 个答案:

答案 0 :(得分:9)

Sizing a Scroll Pane中所述,某些组件可以提供有关设置视口首选大小的有用信息。 setVisibleRowCount()的{​​{1}}方法特别方便,但即使JList也可以。当然,sscce会有所帮助。

附录:作为具体示例,下面的对话框最初的大小为 N -2行。随着更多内容的添加,对话框会一直增长,直到数字达到 N 。此时,滚动条开始“增长”。该示例使用getViewport().setPreferredSize(…),但任何Scrollable组件都应具有适应性。

JList

答案 1 :(得分:5)

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

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

然后:

1)以典型内容合理的方式实现getPreferredScrollableViewportSize()(对于JList f.i.,它是显示的首选行数,也就是:visibleRowCount)
2)为那些“合理的条款”实施setter / getters

这个附加层(协调“合理术语”)允许所有协作组件尽最大努力提出强大的大小提示,而不会像setXXSize那样产生不友好的干扰(这是 no-no-never-ever ,简单地忘记那些方法存在;)

答案 2 :(得分:2)

导致JDialog大小的pack()方法依赖于对getPreferredSize()的调用来确定要使用的大小。

如果您是JDialog的子类,则可以通过继承此方法来强制执行最大大小。

示例:

@Override 
public Dimension getPreferredSize() {    
  int maxWidth=500;    
  int maxHeight=300;    
  Dimension dim=super.getPreferredSize();    
  if (dim.width>maxWidth) dim.width=maxWidth;    
  if (dim.height>maxHeight) dim.height=maxHeight;    
  return dim; 
}

答案 3 :(得分:1)

你必须从getSize()里面的JComponents计算JScrollPane只是简单的例子

编辑:并调用JDialog#pack()

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class PackDialog {
    private JDialog dlg;
    private JScrollPane scrollPane;
    private JPanel panel;
    private JButton btn;

    public PackDialog() {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(300, 30));
        btn.addActionListener(new java.awt.event.ActionListener() {

            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnActionPerformed(evt);
            }

            private void btnActionPerformed(ActionEvent evt) {
                int h = panel.getHeight();
                h += btn.getHeight();
                int w = panel.getWidth();
                dlg.setPreferredSize(new Dimension(w, h));
                dlg.pack();
            }
        });
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 600));
        panel.setLayout(new BorderLayout(10, 10));
        panel.add(btn, BorderLayout.SOUTH);
        scrollPane = new JScrollPane(panel);
        dlg = new JDialog();
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setPreferredSize(new Dimension(400, 300));
        dlg.add(scrollPane);
        dlg.pack();
        dlg.setVisible(true);
    }

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

            @Override
            public void run() {
                PackDialog pd = new PackDialog();
            }
        });
    }}