【问题标题】:Ghost image on D'n'D from canvas 2d into canvas 3dD'n'D 上的幽灵图像从 2d 画布到 3d 画布
【发布时间】:2012-11-19 22:11:27
【问题描述】:

我试图在执行awt.dnd 操作时从程序顶部面板中的2D 画布到程序中间面板中的3D 画布执行awt.dnd 操作。使用setDragImage() 实现了 D-n-D 的东西并开始工作。我可以很容易地得到我的幻影图像,但我需要让它在 Java 1.6 上工作,因为 Java 1.6 缺少这个方法。

现在我尝试了很多玻璃面板等:

  • 除了 Canvas3D(重量级组件)之外,玻璃面板正常工作
  • 如果我使用 AWT 玻璃面板(框架),它会绘制我的幻像,但整个程序是黑色的

GHOST drag and drop, over multiple windows: 看到这个有趣的链接来创建JDialog,也创建了它,但我不知道如何让我的对话框不透明:WindowsUtils.setOpaque(d, false); 不是我拥有的课程,我找不到它。这是必要的,因为我需要光标上的这个 1 像素空间才能将注意力集中在我的 canvas3d 上。我希望有人对我在 Google 上找不到任何有用的建议有任何建议,谢谢

【问题讨论】:

  • 好吧对不起!它是关于 java-dnd-ghostimages 的!

标签: java image swing drag-and-drop awt


【解决方案1】:

你要做很多工作。我不喜欢 canvas3dcanvas2d,但正如你所说,它们似乎是重量级的组件,这些往往不支持透明度。

Per-Pixel Alphing 作为私有 API 被引入 Java 6.10,并开始与 Java 7 一起公开。

你可以访问私有API,但不推荐,下一个你需要问的问题是,当API不存在时该怎么办?!

public static void setOpaque(Window window, boolean opaque) {
    try {
        Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
        if (awtUtilsClass != null) {
            Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class);
            method.invoke(null, window, opaque);
        }
    } catch (Exception exp) {
    }
}

【讨论】:

  • 感谢您的提示,我要试试这个,任何解决方案都很好,我需要拖放图像。我什至试图在 dnd 可转移类中搜索它们是如何实现 setDragImage() 方法的,但我找不到它实际绘制的部分。
  • 首先,不要忘记使“拖动”窗口不修饰,否则 Java 将无法使其不透明。其次,传输 API 很有营养,因为它没有提供能够提供拖动图像(或忽略它)的实现。第三次签出DragSource#createDragSourceContext
  • ps - 不要忘记,支持拖动图像将是特定于平台的
  • 是的,非常感谢非不透明样式已经有效。抱歉,我不明白你的意思是“你需要问的下一个问题是当 API 不存在时该怎么办?!”它们什么时候不存在?
  • AWTUtilities 在 Java 6 更新 10 中作为私有 API 引入。如果您的程序的用户使用的是早期版本的 Java,那么这个 API 将不存在(我没有在 Java 7 上测试过,因为它有自己的 API,所以它可能也不存在)
猜你喜欢
  • 2015-11-11
  • 2011-02-25
  • 1970-01-01
  • 2012-01-09
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多