【发布时间】:2017-03-01 16:05:19
【问题描述】:
问题
我有一个应用程序模式JDialog,我希望它具有强制的最小尺寸(即操作系统阻止用户使窗口小于最小尺寸)。但窗口仍应可调整大小(即setResizable(false) 不是一个选项)。最好是隐式定义强制的最小尺寸(即由子组件的最小尺寸动态确定,而不是使用setMinimumSize 明确设置的固定尺寸)
我遇到的问题是,如果我没有通过setMinimumSize 明确设置JDialog 的最小大小,操作系统将不会强制执行它。因此,即使JDialog 隐含地知道在任何给定时间使用的正确最小大小,除非我调用类似dlg.setMinimumSize(dlg.getMinimumSize()) 的东西,否则不会强制执行该大小。请参阅下面的 SSCCE。
在许多情况下,在打开对话框之前明确设置最小尺寸就足够了。但是,有时我会遇到这样一种情况,即在打开对话框时隐式最小大小可能会发生变化,例如可以从对话框中动态添加或删除子组件。如果我在对话框上设置了一个明确的最小尺寸,那么这个尺寸对于新布局来说可能不够大。
有什么方法可以配置JDialog 来强制执行对话框的隐式最小大小?如果没有,是否有其他优雅的方法可以在打开的对话框上强制动态更改最小大小?
SSCCE
在此 SSCCE 中,目标是创建一个不能小于 300x300 像素的对话框。只有明确设置了最小大小,才能实现此目标。
public class SSCCE {
public static void main(String[] args) {
JDialog dlg = new JDialog(null, ModalityType.APPLICATION_MODAL);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(new JLabel("300x300"), BorderLayout.CENTER);
// The panel is given a hard-coded minimum size just to make the
// problem easier to see
pnl.setMinimumSize(new Dimension(300,300));
dlg.add(pnl);
System.out.println("Dialog minimum size: " + dlg.getMinimumSize());
// Minimum size is not enforced by the OS without this call
dlg.setMinimumSize(dlg.getMinimumSize());
System.out.println("Dialog minimum size: " + dlg.getMinimumSize());
dlg.pack();
dlg.setVisible(true);
}
}
使用明确的setMinimumSize 调用:
没有明确的setMinimumSize 调用:
两种情况下的输出:
对话框最小尺寸:java.awt.Dimension[width=300,height=300]
对话框最小尺寸:java.awt.Dimension[width=300,height=300]
对于它的价值 - 我在带有 jdk1.8.0_91 的 Windows 8.1 上观察到这一点。
【问题讨论】:
-
“一个不能小于 300x300 像素的对话框。” 为什么?更重要的是,为什么是对话框,而不是对话框的内容区域(面板)?
-
@AndrewThompson 为 SSCCE 任意选择 300x300 尺寸。在 SSCCE 中,我手动将其设置为
JPanel的最小尺寸,以模拟一些具有固有最小尺寸的控件或容器,如 JLabel 或 JTable。最小尺寸通过布局管理器向上传播 - 因为面板的最小尺寸为 300x300,所以对话框的最小尺寸也应为 300x300。但操作系统不会强制执行此操作,除非我通过调用JDialog.setMinimumSize()明确设置最小大小。