- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题
我们的独立 Swing 应用程序在某些特定事件(按钮单击等)中显示模态 JDialog该对话框包含一些其他 Swing 组件(JLabels、JButtons 等)。我们调用JDialog.pack()
(或JOptionPane
showDialog(...)
方法隐式调用它)。通过 pack()
方法计算的尺寸总是恒定的(例如 300x100 像素。)不幸的是,有时可见对话框的真实尺寸是 1x1 像素(JDialog.getSize( ).equals(新维度(1, 1))
).
JDialog初始化
我们在应用程序中初始化 JDialog
有两种方法。我们检查了两种初始化方法总是从 EventDispatchThread 调用。
第一种方法
我们只是创建了一个 ADialog
的实例,它是 JDialog
的子类。这是我们初始化过程的一个片段:
ADialog dialog = new ADialog();
dialog.setContentPane(content);
dialog.setVisible(true);
这是我们的 ADialog
实现:
public class ADialog extends JDialog implements ComponentListener {
public JfosDialog(Frame owner) {
super(owner);
init();
}
private void init() {
super.addComponentListener(this);
}
@Override
public void componentShown(ComponentEvent e) {
// Calling pack() at this place is really weird, but we
// have to do it since some subclasses put their
// content to dialog in overriden componentShown().
pack();
}
@Override
public void componentMoved(ComponentEvent e) { /** not interested */ }
@Override
public void componentResized(ComponentEvent e) { /** not interested */ }
}
第二种方法
public JOptionPane showDialog(...) {
JOptionPane jop = new JOptionPane(message, msgType, option, null, textMessages);
JDialog dialog = jop.createDialog(owner, titleMsg);
setDialogTraversal(dialog);
dialog.setVisible(true);
dialog.dispose();
return jop;
}
可重复性
环境
用第一种初始化方法重现问题
我们只是显示然后隐藏对话 N 次(0 < N < 1000),并且一次对话的维度是 1x1(线程问题、竞争条件的迹象)。由于这个问题的性质是非常随机的,我们写的很简单 java.awt.Robot循环显示和隐藏对话框的脚本。它只是比手动操作更舒服。
使用第二种初始化方法重现问题
步骤同第一种方法:只显示然后隐藏对话框N次。不幸的是,我们无法在我们的开发环境中重现它,但它可以很容易地在生产 PC 中重现(CPU 与我们的开发环境不同,安装了一些永久创建系统负载的防病毒软件等)
到目前为止,我们无法在某种测试/示例项目中重现该问题。这可能表明我们的应用程序有问题。但是,问题似乎出在 Swing 的 native 代码中(请参阅“跟踪”部分)。
追踪
我们在 64 位 OpenJDK 1.6.0_24 中追踪了问题的原因。我们发现 JDialog
的维度被 XToolkit
触发的 XConfigureEvent
修改。该事件在本地方法调用返回后在 XToolkit.run(boolean)
方法的事件循环中构造。
为了简化事情,我在这里只发布了一个代码片段,说明了 XToolkit
的事件循环机制和我们的跟踪结果。您还可以看到 full source code here .
public class XToolkit ... {
...
public void run(boolean loop) {
XEvent ev = new XEvent();
while(true) {
awtLock();
try {
if (loop == SECONDARY_LOOP) {
...
} else {
...
// ===========================================
// The following invocation of native method sometimes
// updates ev object in a way that ev.get_type() method returns value 22
// indicating that the event's type is XConfigureEvent.
// In such case, as I mentioned in text above, the value of
// ev.get_xconfigure().get_width() / .get_height()
// is sometimes 1.
XlibWrapper.XNextEvent(getDisplay(),ev.pData); // <-----
// ===========================================
}
...
// The XConfigureEvent with get_width() == 1 and
// get_heigth() == 1 is dispatcher here:
dispatchEvent(ev); // <-----
...
} catch (...) {
...
}
}
}
...
}
您是否有任何想法如何修复此错误/更深入地跟踪它/更稳健地重现它...?
我很感激任何想法,因为这个错误真的很痛苦。
最佳答案
pack() 应遵循组件的首选(或最小尺寸,具体取决于布局管理器)。
尝试为对话框中的组件明确设置最小和首选大小,看看是否能解决问题。
就竞争条件而言,它也可能是代码中的不正确初始化。当布局管理器查询它们的首选(或最小尺寸)时,大多数组件将显示它们的内容(例如 JLabel 的文本)。因此,可能填充组件的代码并不总是以相同的顺序运行。您确定在 AWT 线程上创建了对话框和所有包含的组件吗?
关于java - 模态 JDialog 的 1x1 维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841829/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!