java - 如何在拖放过程中显示图标

标签 java swing drag-and-drop icons netbeans-platform

我正在开发一些 NetBeans 平台应用程序,目前我在 Visual Library 中停留在一些细节上。好的,这是问题。我的应用程序有可视化编辑器,带有托盘、场景,一切都很好,只是当我将图标从托盘拖到场景时出现问题。它们在拖动事件期间不显示,我想创建那种效果,有人可以帮忙吗?

最佳答案

我分两个阶段进行:

1) 创建调色板元素的屏幕截图(图像)。我懒惰地创建屏幕截图,然后将其缓存在 View 中。要创建屏幕截图,您可以使用此代码段:

screenshot = new BufferedImage(getWidth(), getHeight(), java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE);// buffered image
// creating the graphics for buffered image
Graphics2D graphics = screenshot.createGraphics();
// We make the screenshot slightly transparent
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f)); 
view.print(graphics); // takes the screenshot
graphics.dispose();

2) 在接收 View 上绘制屏幕截图。当拖动手势被识别时,找到一种方法使屏幕截图可用于接收 View 或其祖先之一(您可以使其在框架或其内容 Pane 上可用,具体取决于您希望屏幕截图拖动可用的位置)并在 paint 方法中绘制图像。像这样:

一个。提供屏幕截图:

capturedDraggedNodeImage = view.getScreenshot(); // Transfer the screenshot
dragOrigin = SwingUtilities.convertPoint(e.getComponent(), e.getDragOrigin(), view); // locate the point where the click was made

随着鼠标的拖动,更新截图的位置

// Assuming 'e' is a DropTargetDragEvent and 'this' is where you want to paint
// Convert the event point to this component coordinates
capturedNodeLocation = SwingUtilities.convertPoint(((DropTarget) e.getSource()).getComponent(), e.getLocation(), this);
// offset the location by the original point of drag on the palette element view
capturedNodeLocation.x -= dragOrigin.x;
capturedNodeLocation.y -= dragOrigin.y;
// Invoke repaint
repaint(capturedNodeLocation.x, capturedNodeLocation.y, 
   capturedDraggedNodeImage.getWidth(), capturedDraggedNodeImage.getHeight());

在 paint 方法中绘制屏幕截图:

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.drawImage(capturedDraggedNodeImage, capturedNodeLocation.x, 
        capturedNodeLocation.y, capturedDraggedNodeImage.getWidth(), 
        capturedDraggedNodeImage.getHeight(), this);
}

您可以在鼠标移动时调用 paintImmediately(),而不是调用 repaint() 并在 paint() 方法中执行绘制,但渲染会差很多,您可能会观察到一些闪烁,所以我不推荐那个选项。使用 paint() 和 repaint() 可提供更好的用户体验和流畅的渲染。

关于java - 如何在拖放过程中显示图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10411191/

相关文章:

java - 如何从 ArrayList 填充 JComboBox

java - 奇怪的JFileChooser情况,右键菜单文本为空白

javascript - 使用纯 javascript 拖放并再次拖动

java - 如何让媒体播放器自动切换到下一轨道?

java - 嵌套 for 循环输出不正确

java - 如何从两个 JFrame 上的 2 个按钮数组中判断按下了哪个按钮

css - 哪种可打印元素比线性渐变更好用?

java - 使用 JavaFX 多次拖动节点

java - 每个组的MySQL行号与组内存

java - 无法将大数据集加载到 h2 数据库中