- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题1:图像被删除后,我们如何在删除的面板内移动图像(使用鼠标指针)。 (图像的目的地,我想要在释放鼠标的地方。然后也更改位置(使用鼠标会更好。或使用按钮 - 但使用鼠标更好)
问题2:结束后如何更改位置?
p.s我想要这里的图像到组件。
首先我拖放组件。然后使用鼠标指针更改位置(移动它)。
这里是代码:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestDnD {
public static void main(String[] args) {
new TestDnD();
}
public TestDnD() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JList list;
public TestPane() {
setLayout(new BorderLayout());
list = new JList();
DefaultListModel model = new DefaultListModel();
model.addElement(new User("Shaun"));
model.addElement(new User("Andy"));
model.addElement(new User("Luke"));
model.addElement(new User("Han"));
model.addElement(new User("Liea"));
model.addElement(new User("Yoda"));
list.setModel(model);
add(new JScrollPane(list), BorderLayout.WEST);
DragGestureRecognizer dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
list,
DnDConstants.ACTION_COPY_OR_MOVE,
new DragGestureHandler(list));
JPanel panel = new JPanel(new GridBagLayout());
add(panel);
DropTarget dt = new DropTarget(
panel,
DnDConstants.ACTION_COPY_OR_MOVE,
new DropTargetHandler(panel),
true);
}
}
public static class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
public static class UserTransferable implements Transferable {
public static final DataFlavor USER_DATA_FLAVOR = new DataFlavor(User.class, "User");
private User user;
public UserTransferable(User user) {
this.user = user;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{USER_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return USER_DATA_FLAVOR.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
Object value = null;
if (USER_DATA_FLAVOR.equals(flavor)) {
value = user;
} else {
throw new UnsupportedFlavorException(flavor);
}
return value;
}
}
protected class DragGestureHandler implements DragGestureListener {
private JList list;
public DragGestureHandler(JList list) {
this.list = list;
}
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
Object selectedValue = list.getSelectedValue();
if (selectedValue instanceof User) {
User user = (User) selectedValue;
Transferable t = new UserTransferable(user);
DragSource ds = dge.getDragSource();
ds.startDrag(dge, null, t, new DragSourceHandler());
}
}
}
protected class DragSourceHandler implements DragSourceListener {
public void dragEnter(DragSourceDragEvent dsde) {
}
public void dragOver(DragSourceDragEvent dsde) {
}
public void dropActionChanged(DragSourceDragEvent dsde) {
}
public void dragExit(DragSourceEvent dse) {
}
public void dragDropEnd(DragSourceDropEvent dsde) {
System.out.println("Drag ended...");
}
}
protected class DropTargetHandler implements DropTargetListener {
private JPanel panel;
public DropTargetHandler(JPanel panel) {
this.panel = panel;
}
public void dragEnter(DropTargetDragEvent dtde) {
if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
System.out.println("Accept...");
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
System.out.println("Drag...");
dtde.rejectDrag();
}
}
public void dragOver(DropTargetDragEvent dtde) {
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
}
public void drop(DropTargetDropEvent dtde) {
System.out.println("Dropped...");
if (dtde.getTransferable().isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
Transferable t = dtde.getTransferable();
if (t.isDataFlavorSupported(UserTransferable.USER_DATA_FLAVOR)) {
try {
Object transferData = t.getTransferData(UserTransferable.USER_DATA_FLAVOR);
if (transferData instanceof User) {
User user = (User) transferData;
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
panel.add(new JLabel(user.getName()));
panel.revalidate();
panel.repaint();
} else {
dtde.rejectDrop();
}
} catch (UnsupportedFlavorException ex) {
ex.printStackTrace();
dtde.rejectDrop();
} catch (IOException ex) {
ex.printStackTrace();
dtde.rejectDrop();
}
} else {
dtde.rejectDrop();
}
}
}
}
}
最佳答案
本质上,这是在两个类似 Pane 之间拖动图像的实现。
如果您要添加不允许移动组件
的限制,那么您将不得不确保源容器和目标容器知道如何处理拖动和移动。删除(并渲染结果)
这花了 4 个小时,所以在你向我提出更新请求之前,请确保你已经努力理解代码并实现了你自己的更改
该实现将Image
包装在DragImage
类中,该类维护有关图像在其容器内的位置的信息,这用于生成拖动图像...
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class TestDnD {
public static void main(String[] args) {
new TestDnD();
}
public TestDnD() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(0, 2, 10, 10));
((JComponent) frame.getContentPane()).setBorder(new EmptyBorder(10, 10, 10, 10));
BufferedImage img = ImageIO.read(new File("issue376.jpg"));
ImagePane imagePane = new ImagePane();
imagePane.addImage(img);
frame.add(imagePane);
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
System.exit(0);
}
}
});
}
public class ImagePane extends JPanel {
private List<DragImage> images;
private DragImages dropImages;
private Point dragPoint;
public ImagePane() {
setBorder(new LineBorder(Color.GRAY));
images = new ArrayList<>(25);
DragGestureRecognizer dgr = DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
this,
DnDConstants.ACTION_COPY_OR_MOVE,
new DragGestureHandler(this));
DropTarget dt = new DropTarget(
this,
DnDConstants.ACTION_COPY_OR_MOVE,
new DropTargetHandler(this),
true);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
public DragImage getImageAt(Point p) {
DragImage at = null;
for (DragImage di : images) {
if (di.contains(p)) {
at = di;
break;
}
}
return at;
}
protected boolean contains(Image image) {
boolean contains = false;
for (DragImage di : images) {
if (di.getImage() == image) {
contains = true;
break;
}
}
return contains;
}
public void addImage(Image image) {
if (image != null) {
if (!contains(image)) {
int x = (int) Math.round(Math.random() * getWidth());
int y = (int) Math.round(Math.random() * getHeight());
addImageAt(new Point(x, y), image);
}
}
}
public void addImageAt(Point p, Image image) {
if (p != null && image != null) {
if (!contains(image)) {
DragImage di = new DragImage(image, p);
images.add(di);
repaint();
}
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (DragImage di : images) {
g2d.drawImage(di.getImage(), di.getLocation().x, di.getLocation().y, this);
}
if (dropImages != null) {
g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
Point offset = dropImages.getOffset();
for (DragImage di : dropImages.getImages()) {
Point pp = new Point(dragPoint);
pp.x -= offset.getX();
pp.y -= offset.getY();
g2d.drawImage(di.getImage(), pp.x, pp.y, this);
}
}
g2d.dispose();
}
public void removeImages(List list) {
if (list != null && list.size() > 0) {
for (Object obj : list) {
if (obj instanceof DragImage) {
removeImage((DragImage) obj);
}
}
}
}
public void removeImage(DragImage img) {
images.remove(img);
repaint();
}
protected void setDragImages(DragImages dragImages) {
this.dropImages = dragImages;
repaint();
}
public void addImagesAt(Point location, List images) {
if (images != null && images.size() > 0) {
for (Object obj : images) {
if (obj instanceof Image) {
Image img = (Image) obj;
addImageAt(location, img);
location.x += 10;
location.y += 10;
if (location.x >= getWidth()) {
location.x = 0;
}
if (location.y >= getHeight()) {
location.y = 0;
}
}
}
}
}
protected void addImages(DragImages dragImages) {
for (DragImage di : dragImages.getImages()) {
images.add(di);
}
repaint();
}
protected void addImagesAt(Point dropPoint, DragImages dragImages) {
Point offset = dragImages.getOffset();
for (DragImage di : dragImages.getImages()) {
Point p = di.getLocation();
p.x = dropPoint.x - offset.x;
p.y = dropPoint.y - offset.y;
images.add(di);
}
repaint();
}
protected void setDragPoint(Point location) {
dragPoint = location;
repaint();
}
}
public static class ImageTransferable implements Transferable {
public static final DataFlavor DRAG_IMAGE_DATA_FLAVOR = new DataFlavor(List.class, "Images");
private DragImages dragImages;
public ImageTransferable(DragImages dragImages) {
this.dragImages = dragImages;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DRAG_IMAGE_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DRAG_IMAGE_DATA_FLAVOR.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return dragImages;
}
}
public class DragImage {
private Image image;
private Point p;
public DragImage(Image image, Point p) {
this.image = image;
this.p = p;
}
public Image getImage() {
return image;
}
public Point getLocation() {
return p;
}
public Dimension getSize() {
return new Dimension(image.getWidth(null), image.getHeight(null));
}
public boolean contains(Point p) {
return new Rectangle(getLocation(), getSize()).contains(p);
}
}
public class DragImages {
private Point offset;
private List<DragImage> images;
public DragImages(Point offset, DragImage... images) {
this.offset = offset;
this.images = Arrays.asList(images);
}
public Point getOffset() {
return offset;
}
public List<DragImage> getImages() {
return images;
}
}
protected class DragGestureHandler implements DragGestureListener {
private ImagePane imagePane;
public DragGestureHandler(ImagePane list) {
this.imagePane = list;
}
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
DragImage di = imagePane.getImageAt(dge.getDragOrigin());
if (di != null) {
Point origin = dge.getDragOrigin();
Point p = new Point();
p.x = origin.x - di.getLocation().x;
p.y = origin.y - di.getLocation().y;
Transferable t = new ImageTransferable(new DragImages(p, di));
imagePane.removeImage(di);
DragSource ds = dge.getDragSource();
ds.startDrag(
dge,
null,
t,
new DragSourceHandler(imagePane));
}
}
}
protected class DragSourceHandler implements DragSourceListener {
private ImagePane pane;
public DragSourceHandler(ImagePane pane) {
this.pane = pane;
}
public void dragEnter(DragSourceDragEvent dsde) {
}
public void dragOver(DragSourceDragEvent dsde) {
pane.repaint();
}
public void dropActionChanged(DragSourceDragEvent dsde) {
}
public void dragExit(DragSourceEvent dse) {
}
public void dragDropEnd(DragSourceDropEvent dsde) {
if (!dsde.getDropSuccess()) {
Transferable t = dsde.getDragSourceContext().getTransferable();
if (t != null) {
try {
Object transferData = t.getTransferData(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR);
if (transferData instanceof DragImages) {
DragImages di = (DragImages) transferData;
pane.addImages(di);
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
}
}
}
protected class DropTargetHandler implements DropTargetListener {
private ImagePane panel;
public DropTargetHandler(ImagePane panel) {
this.panel = panel;
}
public void dragEnter(DropTargetDragEvent dtde) {
if (dtde.getTransferable().isDataFlavorSupported(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
updateDragImages(dtde);
} else {
dtde.rejectDrag();
}
}
public void dragOver(DropTargetDragEvent dtde) {
updateDragImages(dtde);
panel.repaint();
}
public void dropActionChanged(DropTargetDragEvent dtde) {
}
public void dragExit(DropTargetEvent dte) {
panel.setDragImages(null);
}
public void drop(DropTargetDropEvent dtde) {
panel.setDragImages(null);
if (dtde.getTransferable().isDataFlavorSupported(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR)) {
Transferable t = dtde.getTransferable();
if (t.isDataFlavorSupported(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR)) {
try {
Object transferData = t.getTransferData(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR);
if (transferData instanceof DragImages) {
DragImages images = (DragImages) transferData;
dtde.dropComplete(true);
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
panel.addImagesAt(dtde.getLocation(), images);
} else {
dtde.rejectDrop();
}
} catch (UnsupportedFlavorException ex) {
ex.printStackTrace();
dtde.rejectDrop();
} catch (IOException ex) {
ex.printStackTrace();
dtde.rejectDrop();
}
} else {
dtde.rejectDrop();
}
}
}
protected void updateDragImages(DropTargetDragEvent dtde) {
panel.setDragImages(null);
Transferable t = dtde.getTransferable();
if (t != null) {
try {
Object transferData = t.getTransferData(ImageTransferable.DRAG_IMAGE_DATA_FLAVOR);
if (transferData instanceof DragImages) {
panel.setDragPoint(dtde.getLocation());
panel.setDragImages((DragImages)transferData);
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
}
}
}
关于java - 拖放后移动组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478413/
我在这里有一个我想要做的事情的例子:http://jsbin.com/OwoYAlEQ/1/edit 这是我的 HTML: person one person two person three per
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我想知道是否有人知道是否有一个预先制定的解决方案:我在 ASP.net 网站上有一个列表,我希望用户能够通过拖放对列表进行重新排序。此外,我希望有第二个列表,用户可以将第一个列表中的项目拖到其中。 到
我在我的 Web 应用程序中使用 Ajax ControlToolkit 中的 ModalPopupExtender。我将其 Drag 属性设置为 true,但是当我拖动弹出面板并将其放到新位置时,它
所以,基于this answer ,我有一组可以拖放并卡入到位的 div。唯一的问题是,可拖动的 div 具有不同的高度,我需要它们始终捕捉到目标的底部,而不是顶部。 您可以在this JsFiddl
我一直在使用 Bea 的解决方案 here一段时间后发现它非常有帮助。现在我遇到的问题是,当我将项目拖放到另一个 ListView 控件中或拖放到另一个 ListView 控件中,并且我想在拖动“期间
我试图在使用 QTreeWidget.setItemWidget() 重新父级(拖放)后将小部件放入 QTreeWidgetItem 但是,如果编译以下代码,结果是 QTreeWidgetItem 内
这是场景,我使用的是prototype和scriptaculous,但我相信jquery也会有同样的问题。我在相对定位的 div 中有一个可拖动图像的列表。问题是我无法将图像拖出父 div...好吧.
我正在使用一个普通(Bootstrap)表,我想在其中包含可排序的行。我正在使用 Angular CDK (DragDropModule) 来实现排序/排序。但是,当拖动行时,它会扭曲宽度,因为 cd
我正在尝试在我的 UICollectionView 中实现拖放机制,这与在快捷方式应用程序中重新排序快捷方式的组件非常相似。 截至目前,行为是当您开始拖动时,会留下一个透明的单元格 View ,而另一
我有以下 Jquery UI 拖放 jsfiddle https://jsfiddle.net/zoojsfiddle/ud96jdcp/ 具有
我希望创建一个基于网络的“公告板”,可以这么说,用户可以在其中创建/删除/拖放“图钉”,而不允许重叠“图钉”。 这是一个图表,应该有助于说明我正在尝试创建的内容: 'pins' 可能已创建双击;他们会
我是一名优秀的程序员,十分优秀!