【问题标题】:Java Swing Drag and Drop with popup dialog带有弹出对话框的 Java Swing 拖放
【发布时间】:2011-05-03 20:29:08
【问题描述】:

我希望在 Java Swing 应用程序中具有以下行为:

  1. 用户拖放图标。
  2. 如果还应操作其他图标,则会通过模式对话框提示用户。
  3. 在用户选择“是”、“否”或“取消”(或关闭对话框)后,Java 开始操作(复制/移动)图标(或取消/关闭时不执行任何操作)。

TransferHandler.canImport() 内,我可以看到放置目标,但看不到图标。

TransferHandler.exportDone() 内,我可以看到图标,但看不到放置目标。

TransferHandler.importData() 内,我可以看到两者,但到那时为时已晚,因为如果我正在执行TransferHandler.MOVE,那么TransferHandler.exportDone() 已经删除了图标。

我上面提到的行为是否可以使用 Java Swing?如果是,我需要使用什么版本的 JDK/JRE,如何实现?

【问题讨论】:

  • 对不起,我完全不明白这个问题。听上去好像是用户拖拽东西,提示后Java自己拖拽其他东西?
  • 我会澄清这个问题 - 我想移动/复制图标,不一定要拖放它们。

标签: java swing drag-and-drop


【解决方案1】:

如果您希望能够拖放项目,以及以编程方式移动/复制它们,您需要确保您有一个正确的 model 设置来支持 查看。这意味着您不应该将业务逻辑直接编码到 GUI 代码中。模型应该简单独立,专注于管理数据的实际任务。在您的情况下,听起来您只需要保存一些对象集合并提供将对象从一个集合移动/复制到另一个集合的方法。执行此操作的代码称为 controller(MVC - 如果您已经熟悉此模式,请原谅我)。然后控制器将更新 GUI 以反映更改。同样,您的拖放操作将触发一个控制器操作,该操作对模型执行类似操作。

【讨论】:

  • 感谢您简洁明了的回答。一旦我对 TransferHandler 和 Transferable 文档/JavaDoc 进行了足够深入的研究,我的想法也是如此。我遇到的问题是控制器/视图层中的时间(和副作用)受在 AWT 事件线程上运行的当前设计的影响。
  • 最佳实践表明模型应该是线程安全的,但如果它只是从 EDT 修改的,那么如果不是,你应该不会有任何问题。您显然了解 EDT 规则。如果您需要进一步的帮助,我需要具体的示例。
  • 再次感谢您的出色回答!事后看来,我修复的代码库是非常不安全的,通过遵循 Java 教程文档和您的指导,我能够重构许多类,并且主要遵循 MVC 模式。今天我正在研究与显示确认提示(对话框)以响应拖放 MOVE 操作有关的线程安全性,这似乎需要取消该操作并正确遵循 MVC 模式。
  • 我很高兴听到这在这么多年后仍然有帮助!在确认提示的情况下,您可以选择在等待用户的决定时保持锁定,除非其他线程可以继续快速处理支持数据至关重要。那时,您确实会选择中止并重试。重试时,您需要再次获得锁并检查有问题的项目是否仍处于与以前相同的状态。如果您的内部模型已经在控制器级别处理锁定,那么后一个选项非常简单。
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 2014-07-05
  • 1970-01-01
  • 2010-12-12
  • 2013-01-01
  • 2012-03-17
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多