【发布时间】:2023-03-18 11:12:01
【问题描述】:
我有一个由 JFrame frm 创建的 JDialog dlg,其中包含一个 JList 列表。 当我修改列表(通过 ListModel)时,列表本身被重新绘制,但不是 JDialog。 这意味着,如果我删除一行,列表将保留一个空行,而如果我添加一行,则在我手动强制重新绘制 dlg (在 frm 中双击)。
以下建议: How to make repaint for JDialog in Swing?
在这篇文章中: Force repaint after button click
我试图从我的控制器类(这是对列表进行更新的地方)调用以下行:
SwingUtilities.getWindowAncestor(dlg).repaint();
但它没有用。 我也试过了:
dlg.repaint();
也没有运气......
有什么线索吗? 非常感谢。
编辑: 我的班级组织如下: 一个控制器类,包含对主 JFrame,frm 的引用。 我还将 JDialog 扩展为 MyDialog,其中包含一个 JList。 当检测到对 frm 的双击时,我会显示 MyDialog 的实例(或创建,如果这是我第一次显示它),并且 JList 会填充传递给 DefaultListModel 的数据。 MyDialog 被绘制,以便列表只有它需要的空间。 现在,当控制器检测到特定事件时,我获取特定的 MyDialog,从 JList 获取 ListModel 并更新它。这里 JList 确实更新了,但 Dialog 保持不变。 我使用这样的代码:
MyDialog dlg = group.getDlg();
if(dlg != null){
DefaultListModel listModel = ((DefaultListModel) dlg.getMyJList().getModel());
listModel.addElement(idStock);
SwingUtilities.getWindowAncestor(dlg).repaint();
}
这不会重新绘制 dlg。 我也试过了:
SwingUtilities.getWindowAncestor(dlg.getMyJList()).repaint();
但它不起作用。
我用调试器检查了这些行是否实际执行。
我没有更多的代码要显示,真的.....
【问题讨论】:
-
你能发布一个准确描述问题的简短示例代码吗?
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
如前所述,发布一些代码。也可以尝试 revalidate(),当然,使用调试器确保您输入了调用 repaint / revalidate 方法的代码。
-
我应该尝试 revalidate() “而不是”还是“之前”重绘?
-
您是否将您的 JList 放入了 JScrollPane 中?如果没有,那就是你应该做的。如果您发布代码,问题会更加明显,已经问了三遍了。