我正在尝试将自定义对象从JPanel拖放到JavaFX场景<为了实现这一点,我创建了一个带有自定义对象和自定义TransferHandler的简单应用程序。在本例中,我的问题是,当我在dragboard=event设置断点时,JavaFX dragboard只有内容。getDragboard()
有人能帮我在没有断点的情况下工作吗?
提前谢谢你。
这是我的代码:
我的对象
public class MyObject
{
private final String text;
public MyObject(String text)
{
this.text = text;
}
public String getText()
{
return text;
}
}
肌对象可转移
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class MyObjectTransferable implements Transferable
{
public static final DataFlavor DATAFLAVOR_MYOBJECT = new DataFlavor(MyObject.class, "myObject");
private final MyObject obj;
public MyObjectTransferable(MyObject obj)
{
this.obj = obj;
}
@Override
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[] {DATAFLAVOR_MYOBJECT};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DATAFLAVOR_MYOBJECT.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
{
return DATAFLAVOR_MYOBJECT.equals(flavor) ? obj : null;
}
}
SwingDnDtoFX
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.GridPane;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SwingDnDtoFX
{
private JLabel statusLabel;
public static void main(String[] args)
{
new SwingDnDtoFX().init();
}
private void init()
{
final JFrame frame = new JFrame();
frame.setSize(1000, 500);
frame.setContentPane(createPanel());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private JPanel createPanel()
{
final JPanel panel;
final JPanel spacePanel;
final Dimension dimension;
panel = new JPanel(new BorderLayout());
spacePanel = new JPanel(new BorderLayout());
dimension = new Dimension(300, 500);
statusLabel = new JLabel();
spacePanel.setBackground(Color.RED);
spacePanel.add(statusLabel, BorderLayout.CENTER);
panel.add(createDragPanel(dimension), BorderLayout.WEST);
panel.add(spacePanel, BorderLayout.CENTER);
panel.add(createDropPanel(dimension), BorderLayout.EAST);
return panel;
}
private JPanel createDragPanel(final Dimension dimension)
{
final JPanel dragPanel;
final JLabel dragLabel;
final DragGestureListener dgl;
final DragSource dragSource;
dragPanel = new JPanel(new GridLayout());
dragLabel = new JLabel("Drag me");
dragSource = new DragSource();
dgl = dge ->
{
final MyObject obj = new MyObject(dragLabel.getText());
final MyObjectTransferable transferable = new MyObjectTransferable(obj);
dge.startDrag(null, transferable);
};
dragSource.createDefaultDragGestureRecognizer(dragLabel, DnDConstants.ACTION_COPY, dgl);
dragLabel.setTransferHandler(new TransferHandler("dragLabel"));
dragLabel.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
final JComponent c = (JComponent) e.getSource();
final TransferHandler th = c.getTransferHandler();
th.exportAsDrag(c, e, TransferHandler.COPY);
}
});
dragPanel.setBackground(Color.CYAN);
dragPanel.setPreferredSize(dimension);
dragPanel.add(dragLabel);
return dragPanel;
}
private JPanel createDropPanel(final Dimension dimension)
{
final JPanel dropPanel;
final JLabel dropLabel;
final DropTargetListener dtl;
dropPanel = new JPanel(new GridLayout(0, 1));
dropLabel = new JLabel("Drop here (Swing)");
dtl = new DropTargetAdapter()
{
@Override
public void drop(DropTargetDropEvent dtde)
{
final Transferable transferable;
final DataFlavor[] dataFlavors;
try
{
transferable = dtde.getTransferable();
dataFlavors = transferable.getTransferDataFlavors();
for (int i = 0; i < dataFlavors.length; i++)
{
if (MyObjectTransferable.DATAFLAVOR_MYOBJECT.equals(dataFlavors[i]))
{
final MyObject data;
dtde.acceptDrop(dtde.getDropAction());
data = (MyObject) transferable.getTransferData(dataFlavors[i]);
showStatus(data, "Swing");
dtde.dropComplete(true);
}
}
}
catch (Exception e)
{
e.printStackTrace();
dtde.rejectDrop();
}
}
};
new DropTarget(dropLabel, dtl);
dropLabel.setOpaque(true);
dropLabel.setBackground(Color.CYAN);
dropPanel.setPreferredSize(dimension);
dropPanel.add(dropLabel);
dropPanel.add(createFX());
return dropPanel;
}
private JFXPanel createFX()
{
final JFXPanel fxPanel;
fxPanel = new JFXPanel();
Platform.runLater(() ->
{
final Scene scene;
final GridPane pane;
final Label label;
final Label title;
pane = new GridPane();
scene = new Scene(pane);
label = new Label();
title = new Label("Drop here (JavaFX)");
pane.add(title, 0, 0);
pane.add(label, 0, 1);
pane.setOnDragOver(event ->
{
final Dragboard dragboard;
final DataFormat dataFormat;
dragboard = event.getDragboard();
dataFormat = DataFormat.lookupMimeType("application/x-java-serialized-object");
if (dragboard.hasContent(dataFormat))
event.acceptTransferModes(TransferMode.COPY);
event.consume();
});
pane.setOnDragDropped(event ->
{
final Dragboard dragboard;
final DataFormat dataFormat;
boolean success = false;
dragboard = event.getDragboard();
dataFormat = DataFormat.lookupMimeType("application/x-java-serialized-object");
if (dragboard.hasContent(dataFormat))
{
final Object content;
final MyObject data;
content = dragboard.getContent(dataFormat);
if (content instanceof MyObject)
{
data = (MyObject) content;
label.setText(data.getText());
SwingUtilities.invokeLater(() -> showStatus(data, "JavaFX"));
success = true;
}
}
event.setDropCompleted(success);
event.consume();
});
fxPanel.setScene(scene);
});
return fxPanel;
}
private void showStatus(MyObject data, String framework)
{
final String date = new SimpleDateFormat("HH:mm:ss").format(new Date());
statusLabel.setText(date + " >> " + framework + " >> " + data.getText());
}
}
onDragover
事件中的循环完成这项工作。
pane.setOnDragOver(event ->
{
final Dragboard dragboard;
final DataFormat dataFormat;
dragboard = event.getDragboard();
dataFormat = DataFormat.lookupMimeType("application/x-java-serialized-object");
for (DataFormat df : dragboard.getContentTypes())
{
// Do nothing...
}
if (dragboard.hasContent(dataFormat))
event.acceptTransferModes(TransferMode.COPY);
event.consume();
});
我在互联网上搜索了如何将JButtons拖放到对象的示例,但我无法使其工作。 我的程序所做的是,当我单击一个按钮时,对象更新了一个字段(使用selectedobject.setField())。我希望能够通过拖动JButton而不是单击来做到这一点。 我该怎么做?我找到了这个,并试图输入我的代码: 我从这里参加了ImageHandler课程。
问题内容: 有人可以告诉我我在做什么错吗?我可以使用常规面板进行拖放操作,但现在尝试使用表格,无法对其进行整理。我对Points和DropTargets感到困惑。不要介意“添加”按钮。我觉得我需要首先处理DnD。 问题答案: 我个人会放弃滚动窗格上的放置目标,这将导致您遇到许多问题。 您的放置方法有点怪异… 这是一个坏主意.... 基本上,您尝试从可转移文件中提取文件列表,并且不管操作成功与否,您
我已经在我的游戏中实现了拖放功能,但到目前为止,我只能“拖放”到硬编码的位置。如图所示: 我想要的是: 当船舶被丢弃时,它的x、y值(相对于GridPane)被保存,或者 飞船掉落到的细胞被保存。 我的setOnDragDropped事件在此处处理: 我觉得这应该是一个简单的鼠标悬停事件或类似的事情,但我不知道该怎么做。 编辑:下面类的完整代码: }
问题内容: 与使用Netbeans Drag n Drop编辑器相比,手动编码Java Swing GUI有什么优势?也许在运行时?在我看来,编辑器会自动创建很多额外的代码,但是我不知道这是否会对加载视图的运行时间产生很大影响。我当前使用编辑器的唯一原因是因为它使GUI的构建变得快速而简单。但是,是否有只能通过编辑器手动编码才能完成的操作? 还有更好的GUI框架吗?我偷看过Java FX,但我确实
我是新来的,最近开始使用AutoIt和selenium在我的web应用程序上执行自动化测试。我目前遇到的情况是,我希望在拖放元素上自动测试(用户可以将文件从桌面/文件夹拖放到web应用程序中)。我知道在selenium中,我可以简单地将文件路径发送到web元素中,但是在这个场景中,我希望能够测试拖放的功能。 我目前正在使用AutoItx4java桥和java编程。总而言之,我需要帮助创建一个脚本,
问题内容: 我必须测试一个Web应用程序,其中包含一个拖放区域,用于从本地文件系统上载文件。我的测试环境基于C#。 对于自动化测试,我使用了Selenium,但是无法从文件系统中拖动文件。上载区域是标签(无标签)。那么最好的方法是什么?AutoIt(是否可以放入网络浏览器)?西库利 问题答案: 单独使用硒是可能的,但这并不简单。它需要在页面中注入新元素以通过接收文件。然后,脚本需要通过发送模拟下降