【发布时间】:2021-04-24 22:45:02
【问题描述】:
我正在开发一个JDialog 子类(我们称之为PendenciesDialog),它向用户显示任意数量的相同大小、垂直堆叠的JPanels(最少一个)以及它们下方的关闭按钮。除了构建 JDialog 并将其打包、显示给用户并让他们关闭对话框之外,不涉及任何交互。
这些JPanels 显示了有关个人每月付款待处理的一些信息,例如帐户名称、待处理状态和付款管理系统的可点击链接。我认为我们不需要关心它们是如何构建的。
现在回答我的问题。我想将JDialog 的宽度保持在屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半,或者如果挂件数量很少或只有一个,则更短。如果我无法通过调整JDialog 来实现这一点(例如,通过覆盖JDialog 的getXXXSize() 方法),我可以调整它的子组件。不过我不确定我需要做什么。
为了构造JDialog,我将其布局管理器设置为BoxLayout,并使用PAGE_AXIS对齐,然后在JPanel的支持下添加JScrollPane(我们称之为JPanel的引用变量pendenciesPanel) 然后添加了一个关闭按钮。那个JPanel 也有一个BoxLayout 经理和PAGE_AXIS 对齐,并且将包含单独的挂起JPanels(实际上由于大小相等的要求,我认为它实际上应该是GridLayout)。
我打算让JScrollPane 显示pendenciesPanel 的视口,并在挂件数量太大而无法容纳JDialog(或JScrollPane)时提供滚动最大高度。
那么根据这个描述,我该如何实现JDialog的大小调整呢?从我所读到的内容看来,最合适的方法似乎是覆盖其 getXXXSize() 方法,例如:
private final Dimension SCREEN_DIMENSION = Toolkit.getDefaultToolkit().getScreenSize();
@Override
public Dimension getMaximumSize() {
return new Dimension(SCREEN_DIMENSION.width / 2, SCREEN_DIMENSION.height / 2);
}
但我尝试覆盖 getMinimumSize()、getPreferredSize()、getSize() 等似乎不起作用,或者我可能执行错误。我需要调整其内部子组件吗?或者只是调整JDialog 就足够了?如果有,怎么做?
【问题讨论】:
-
我的倾向是将挂件 JPanel 放置在一个显示 JPanel 中,其 GridLayout 为一列。显示 JPanel 将放置在 JScrollPane 内。 JScrollPane 将放置在具有 BorderLayout 的主 JPanel 的中心。主 JPanel 将具有足够宽的首选尺寸,以显示悬垂 JPanel 和滚动条,高度等于 JFrame 高度的一半。 JDialog 将被打包。
-
@GilbertLeBlanc 您对
BorderLayout的建议实际上是我的第一次尝试,因为我最初打算在NORTH/PAGE_START位置向对话框添加标题(该功能更改为JDialog窗口的栏标题)和CENTER的挂件。我也同意将尺寸基于JFrame尺寸比基于屏幕尺寸更合适。不过,我不确定如何达到预期的大小,你的意思是我应该覆盖JPanel的getPreferredSize()的宽度和getSize()的高度? -
我通常使用JPanel setPreferredSize 方法。我看不出有什么理由在这里扩展 JPanels。使用 JPanel。
-
我想将 JDialog 的宽度固定在屏幕宽度的一半,并将其最大高度限制为屏幕高度的一半 - 但我可以控制我的桌面。我不想让你告诉我如何使用桌面的空间。如果我想在面板中查看更多项目而不必滚动,我应该能够调整对话框的大小。 ...将覆盖它的 getXXXSize() 方法, - 是的,组件应该负责它自己的大小计算。但是,这些值只是建议。每个布局管理器可能使用也可能不使用这些尺寸。
-
遵守这些限制的初始大小。 - 然后覆盖或设置首选大小,而不是最大大小。