- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JDialog,我希望它具有一定的给定大小:
JDialog dialog = new JDialog();
dialog.setSize(800, 600);
dialog.setResizable(false);
然后我添加一个组件:
JLabel label = new JLabel("Test");
dialog.add(label);
现在我可以使对话框可见并检查组件的大小
dialog.setVisible(true);
System.out.println(label.getSize());
答案是“[width=784,height=562]”。显然,组件的大小已调整为填充对话窗口的整个客户区/内容 Pane 。很好,正如我所愿。
问题:如何在调用 setVisible(true) 之前获取组件的最终大小?
所以我在这里不知所措。我想让布局管理器在显示对话框之前计算所有组件和子组件的正确大小,以适应对话框的整体大小。但我不知道怎么办。
最佳答案
我现在发现可以这样做:
JDialog dialog = new JDialog();
JLabel label = new JLabel("Test");
dialog.add(label);
// pack(), setSize(), validate() in this order will
// set sizes on all components as wished
dialog.pack();
dialog.setSize(800, 600);
dialog.validate();
System.out.println(label.getSize());
这里的输出也是“[width=784,height=562]”,但是对话框还不可见。重要的部分是按顺序组合 pack()、setSize(desiredSize) 和 validate()。 pack() 可能确定对话框的新大小(所有组件的首选大小),这就是为什么必须在此处设置大小并且 validate() 负责调整组件大小的原因。到达相同大小的 setVisible(true) 可能在内部做类似的事情。
多次调整组件的大小似乎有点浪费,但如果没有 pack(),setSize() 和 validate() 也没有任何效果。
我猜其他答案是基于一些误解,因为他们总是隐含地假设您想要拥有首选尺寸,但也有一些情况,例如如果用户调整对话框的大小,或者如果对话框的大小从一开始就固定,您无法获得首选大小,并且某些组件只需要填充可用空间。
这就是这里的布局问题,具有给定的对话框全局大小并确定组件填充可用空间时的大小。 LayoutManagers 很好地解决了这个问题,但通常只在 setVisible(true) 之后。
我测试了一下:
// new dialog
JDialog dialog = new JDialog();
// new label, prints messages if resized or painted
JLabel label = new JLabel("Test") {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("Component painted.");
}
};
label.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
System.out.println("Resized: " + e.getComponent().getSize());
}
});
dialog.add(label);
System.out.println("Size after new JLabel: " + label.getSize());
// pack dialog - necessary for setSize/validate to work
dialog.pack();
System.out.println("Size after pack: " + label.getSize());
// set a size and validate changes sizes
dialog.setSize(800, 600);
dialog.validate();
System.out.println("Size after setSize and validate: " + label.getSize());
// set visible would have also done the trick
dialog.setVisible(true);
System.out.println("Size after setVisible(true): " + label.getSize());
// and another resizing (no validation neccessary)
dialog.setSize(300, 200);
// dispose
dialog.dispose();
输出是
我了解了有关 Swing 内部工作原理的更多信息:
我进行了更多测试,同样使用最大化帧,现在可以将所有结果组合成:第一个 painComponent() 始终具有正确的大小,相关的 componentResized() 事件始终紧随其后,有时两次。但是 LayoutManager之前一定要知道,不然例子画不对。因此,如果有人自己绘制背景,要么在每个 paintComponent 中读出正确的大小,要么实现自定义布局管理器,要么等待调整大小的事件并调用重绘,这样组件就会被绘制两次,但它应该可以工作。应用程序包括要显示的组件数量取决于大小的情况(如在我的地理 map 应用程序中)。
如果用户最大化或调整框架/对话框的大小,我认为流程是这样的:
pack() 可能只是调用 setSize(layout.preferredLayoutSize()) 作为第一步。
因此,例如,如果您必须根据大小添加或删除组件,那么覆盖 setSize() 并在那里监听更改可能是个好主意。我最初是在监听 Resized() 事件,但它们对于第一张图来说来得太晚了。
关于java - 计算 JDialog 组件的大小,在使可见之前设置总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046508/
我正在寻找一种使此打印 HTML 代码 fragment 向后兼容旧 Android 版本的简单方法: @TargetApi(Build.VERSION_CODES.KITKAT) private v
我在 GCC 终端 (centos linux) 中为 ATM 项目编译以下 c 和 .h 代码时收到以下错误。请帮忙,因为我是编程新手。 validate_acc.h #ifndef _VALIDA
在写关于 SO 的不同问题的答案时,我制作了这个片段: @import url('https://fonts.googleapis.com/css?family=Shadows+Into+Light'
试图弄清楚我应该如何在 my_div_class 之前放置一个 span 而不是替换所有它。现在它取代了 div,但我不想这样做。我假设它类似于 :before 但不知道如何使用它。 { va
我正在使用选择库 http://github.hubspot.com/select/和 noUiSlider https://refreshless.com/nouislider/ .我面临的问题如下
我是开发新手,独自工作。我正在使用 Xcode 和 git 版本控制。可能我没有适本地组织和做错事,但我通常决定做 promise 只是为了在我破坏一切之前做出安全点。在那一刻,我发现很难恰本地描述我
我想确保在同一个桶和键上读取和写入时,应该更新获取的值,也就是说,应该在对其进行写入操作之后获取它。我怎样才能做到这一点? 我想要的是,如果我更新一个键的值,如果我同时使用不同线程获取值,则更新同一个
我的问题与this有关问题,已经有了答案: yes, there is a happens-before relationship imposed between actionsof the thre
The before and after hook documentation on Relish仅显示 before(:suite) 在 before(:all) 之前调用。 我什么时候应该使用其中
我有 CSV 行,我想在其中检测所有内部双引号,没有文本限定符。这几乎可以正常工作,但我的正则表达式还可以检测双引号后的字符。 CSV 部分: "7580";"Lorem ipsum";"";"Lor
是否可以通过Youtube数据API检查广告是否可以与特定视频一起显示? 我了解contentDetails.licensedContent仅显示视频是否已上传至同一伙伴然后由其声明版权。由于第三者权
考虑一下用漂亮的彩色图表描述的“像素管道” https://developers.google.com/web/fundamentals/performance/rendering/ 我有一个元素(比
之前?
在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml” 但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建 Controller 时,脚手
悬停时内容被替换,但是当鼠标离开元素时我希望它变回来。我该怎么做? $('.img-wrap').hover(function(){ $(this).find('h4').text('Go
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。
版本:qwt 6.0.1我尝试开发频谱的对数缩放。我使用简单的线条来启用缩放plotspectrum->setAxisScaleEngine(QwtPlot::yLeft, new QwtLog10S
我有两个相同的表,I_Subject 和 I_Temp_Subject,我想将 Temp_Subject 表复制到 Subject 表。 I_Temp_Subject 由简单用户使用,I_Subjec
我的印象是第一次绘制发生在触发 DOMContentLoaded 事件之后。特别是,因为我认为为了让第一次绘制发生,需要渲染树,它依赖于 DOM 构造。另外,我知道 DOM 构造完成时会触发 DOMC
我是一名优秀的程序员,十分优秀!