我一直在搜索互联网以查找示例或如何使用java的拖放操作。我找到了一些,但所有示例只允许您拖动到特定位置,即另一个列表框或文本区域。 我想知道是否有方法将物品拖放到jpanel或类似的容器上,将物品放置在容器上的任何位置。在Java中拖放
在Java中拖放
回答
只要目标是您拖动项目的受支持拖放目标,您就可以将其拖放到容器,如JPanel
。
您可以控制拖放项目在拖放位置的显示方式。如果您的面板覆盖paintComponent()
,那么您可以绘制该项目,但您认为合适。
'是拖动项目到一个JPanel办法'
您可以设置与DropTarget您的JPanel。
public class MyDropTarget extends JPanel implements DropTargetListener {
private MyImage image;
private String text;
public MyDropTarget() {
setBackground(new Color(30,60,10));
this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(30,60,10).brighter(), new Color(30,60,10).darker()));
DropTarget dt = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this, true, null);
this.setDropTarget(dt);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(image != null && image.getImage() != null) {
g.drawImage(image.getImage(), 0, 0, null);
if(image.isError()){
g.setColor(Color.BLACK);
g.drawString(text, 0, 0);
}
}
}
public void dragEnter(DropTargetDragEvent dtde) {
this.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED.brighter(), Color.RED.darker()));
}
public void dragExit(DropTargetEvent dte) {
this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, UIManager.getColor("MenuBar.highlight"), UIManager.getColor("MenuBar.shadow")));
}
public void dragOver(DropTargetDragEvent dtde) {
}
public void drop(DropTargetDropEvent dtde) {
try {
text = (String) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
image = (MyImage)dtde.getTransferable().getTransferData(DataFlavor.imageFlavor);
this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(30,60,10).brighter(), new Color(30,60,10).darker()));
dtde.dropComplete(true);
repaint();
} catch(UnsupportedFlavorException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
this.setDropTarget(null);
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
}
'MyImage'只是java.awt.Image的简单包装 – oliholz
我实现了将这样&降:
用于将&下降已经出现在Java 6中的执行相当方便的机制,但它确实有它的缺点。例如,您应该明确指定放置目标,当您需要在放下目标附近放置对象时,该目标不是非常有用。在标准实现中,也不保证侦听器方法的执行顺序。我会告诉你实现一个更可扩展的Drag的概念。
最初应该将鼠标侦听器(Mouse Listener和MouseMotionListener)分配给所有的Drag Sources。需要实现3种方法:鼠标点击对象的方法,在对象上按住鼠标按钮的同时移动鼠标的方法(MouseMotionListener中的mouseDragged)和鼠标移动方法。
听众分配如下所示:
component.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
//block click right mouse button
if (MouseEvent.BUTTON1 == e.getButton()) {
startDrag(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
//block click right mouse button
if (MouseEvent.BUTTON1 == e.getButton()) {
endDrag(e);
}
}
});
component.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
drag(e);
}
});
因此,当你点击对象拖到&降开始,当你移动鼠标的对象应该移动,当你松开鼠标的对象应该改变它的位置并被移到一个新的容器中。如果对象将在一个容器的所述框架上移动,则可以只实现的mouseDragged()方法,其中,所述拖动对象的坐标将被改变:
@Override
public void mouseDragged(MouseEvent e) {
Point mouseLocation = e.getLocationOnScreen();
Component draggedComponent = (Component) e.getSource();
SwingUtilities.convertPointFromScreen(mouseLocation,
draggedComponent.getParent());
draggedComponent.setLocation(mouseLocation);
}
但是拖动的对象坐标可以是相对于它所在的容器进行设置。因此,当鼠标移动到另一个容器时,需要将组件添加到新的容器并计算新的坐标等。此方法不是非常漂亮和可扩展的,所以我建议使用GlassPane来显示拖动的对象。
的算法如下所示:
点击对象。
获取对象的屏幕截图(请参阅how to make a screenshot)。 隐藏原始对象。
在glassPane上绘制对象的屏幕截图,基于鼠标的 坐标。
当您移动鼠标时,您需要根据 重新绘制屏幕截图到新坐标。
当您释放鼠标时,您需要将对象放置在光标所在的位置的 容器中。
显示原始对象。
使用这种方法,我们没有任何依赖放置光标的容器来放置Drop,相应的,对象可以在任何地方“Dropped”。
玻璃面板与透明效果:
public class GhostGlassPane extends JPanel {
private final AlphaComposite composite;
private BufferedImage ghostImage = null;
private Point location = new Point(0, 0);
public GhostGlassPane() {
setOpaque(false);
composite = AlphaComposite.getInstance(AlphaComposite.
SRC_OVER, 0.7f);
}
public void paintComponent(Graphics g) {
if (ghostImage == null)
return;
Graphics2D g2 = (Graphics2D) g;
g2.setComposite(composite);
g2.drawImage(ghostImage, (int) (location.getX()),
(int) (location.getY()), null);
}
}
在此仅响应执行的概念给出。
此信息是从我的文章取:Frequently Asked Questions during Java applet development
- 1. 在java中拖放图像
- 2. 在硒中拖放java
- 3. Java SWT:拖/放
- 4. Java拖放
- 5. Java拖放和netbeans
- 6. 在Java中实现拖放接口
- 7. 在Eclipse中拖放 - java项目
- 8. 在Java中拖放小工具2D
- 9. 拖放在网页中的Java
- 10. 在VB.NET中拖放和拖放
- 11. Java拖放显示项目拖动
- 12. jCanvas - 在缩放时拖放n拖放
- 13. 在Chrome中拖放
- 14. 在Tkinter中拖放?
- 15. 在Windows中拖放
- 16. 在jstree中拖放
- 17. 在UIScrollView中拖放
- 18. 在MobileSafari中拖放?
- 19. 在android中拖放
- 20. 在GWT中拖放
- 21. 在Treeview中拖放
- 22. 在ScrollView中拖放
- 23. 在C中拖放#
- 24. 拖放在FlowLayoutPanel中
- 25. 在asp.net中拖放?
- 26. 在QML中拖放
- 27. 在XUL中拖放
- 28. 在AngularJS中拖放
- 29. 在radTreeListView中拖放
- 30. 在winapi中拖放
请告诉我们你有什么迄今发现 –
https://eyeasme.com/Shayne/JAVA_DND_EXAMPLE/ –
参见[这里](HTTP://计算器。 com/questions/14273923/how-can-i-set-the-priority-mouse-listener/14276466#14276466)示例为Swing组件的DnD,即将一个'JLabel'从一个'JPanel'拖到另一个 –