设置JDialog的最大大小?

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

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

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

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

认为这是从java.awt.Componentinheritance的.setMaximumSize()方法,但设置它似乎没有任何效果。

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

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

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

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

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

然后:

1)以典型内容合理的方式实现getPreferredScrollableViewportSize()(对于要显示的首选行数的JList fi,又称:visibleRowCount)
2)为那些“合理的条款”实施setter / getters

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

调整滚动窗格大小中所述 ,某些组件可以提供有关设置视口的首选大小的有用信息。 JListsetVisibleRowCount()方法特别方便,但即使是getViewport().setPreferredSize(…)也可以。 当然, sscce会有所帮助。

附录:作为一个具体的例子,下面的对话框最初的大小为N -2行。 随着更多的添加,对话框会增长,直到数字达到N. 此时,滚动条开始“增长”。 该示例使用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(); } }); } } 

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

如果您是JDialog的子类,则可以通过inheritance此方法来强制实施最大大小。

例:

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

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

编辑:并调用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(); } }); }}