我有一个包含自定义对象的ArrayList的JList,我试图创建拖放到字段中。我无法理解如何在Transferable中打包和接收对象。
据我所知:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
public class FlightProjectInterface extends JFrame{
//create GUI Objects
private JFrame primaryFrame;
private JPanel createFlightPanel;
private JPanel aircraftLayout;
private JList personsJList, personsOnFlightJList;
private JTextField pilotLabel, coPilotLabel, backseat1Label, backseat2Label;
public FlightProjectInterface(){
//establish frame
super("Create Flight");
setLayout( new FlowLayout());
//aircraftPanel
aircraftLayout = new JPanel();
aircraftLayout.setLayout(new GridLayout(2,2));
pilotLabel = new JTextField("Drag Pilot Here");
//build person load list
DefaultListModel listModel = new DefaultListModel();
for (Person person : Database.persons)
listModel.addElement(person);
personsJList = new JList(listModel);
personsJList.setVisibleRowCount(5);
personsJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
personsJList.setDragEnabled(true);
add( new JScrollPane(personsJList) );
aircraftLayout.add(pilotLabel);
add(aircraftLayout);
}//end constructor
}
澄清:我在从JList中选择对象并从中创建一个Transferable时遇到麻烦。使用上面的代码,对象的toString表示形式只是粘贴在文本字段中,因此我无法从放置的位置提取对象数据。如何“打包”对象本身并将其放入可以从GUI引用对象本身的占位符?
理想情况下,将有4个字段,每个字段都包含一个可以删除的对象。如果将其放下,该人将从列表中删除,但如果被替换,则返回到列表中。
拖放可能是一个复杂的野兽,但可用的冲突信息并没有使它变得更容易。就个人而言,我喜欢避免使用Transfer API,但是我很老。
DnD的粘合剂确实是DataFlavor
。我更喜欢自己动手,让生活更轻松。
在此示例中,我使用了一个TransferHandler
,但实际上,您确实应该有一个拖放对象,特别是对于要拖放到的每个组件都有一个对象。
这样做的主要原因是,canImport
如果您将鼠标拖到上,我会在方法中放入陷阱以拒绝它JList
,因此您只能将其放在上JLabel
,这是一个小技巧,可能不是最好的主意。
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
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.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DnDTransferableTest {
public static void main(String[] args) {
new DnDTransferableTest();
}
public DnDTransferableTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
@SuppressWarnings("serial")
public class TestPane extends JPanel {
private JList<ListItem> list;
private JLabel label;
public TestPane() {
list = new JList<ListItem>();
list.setDragEnabled(true);
list.setTransferHandler(new ListTransferHandler());
DefaultListModel<ListItem> model = new DefaultListModel<ListItem>();
for (int index = 0; index < 10; index++) {
model.addElement(new ListItem("Item " + index));
}
list.setModel(model);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weighty = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;
add(new JScrollPane(list), gbc);
label = new JLabel("Drag on me...");
gbc.gridx++;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.NONE;
add(label, gbc);
label.setTransferHandler(new ListTransferHandler());
}
}
@SuppressWarnings("serial")
public class ListTransferHandler extends TransferHandler {
@Override
public boolean canImport(TransferSupport support) {
return (support.getComponent() instanceof JLabel) && support.isDataFlavorSupported(ListItemTransferable.LIST_ITEM_DATA_FLAVOR);
}
@Override
public boolean importData(TransferSupport support) {
boolean accept = false;
if (canImport(support)) {
try {
Transferable t = support.getTransferable();
Object value = t.getTransferData(ListItemTransferable.LIST_ITEM_DATA_FLAVOR);
if (value instanceof ListItem) {
Component component = support.getComponent();
if (component instanceof JLabel) {
((JLabel)component).setText(((ListItem)value).getText());
accept = true;
}
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
return accept;
}
@Override
public int getSourceActions(JComponent c) {
return DnDConstants.ACTION_COPY_OR_MOVE;
}
@Override
protected Transferable createTransferable(JComponent c) {
Transferable t = null;
if (c instanceof JList) {
@SuppressWarnings("unchecked")
JList<ListItem> list = (JList<ListItem>) c;
Object value = list.getSelectedValue();
if (value instanceof ListItem) {
ListItem li = (ListItem) value;
t = new ListItemTransferable(li);
}
}
return t;
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
System.out.println("ExportDone");
// Here you need to decide how to handle the completion of the transfer,
// should you remove the item from the list or not...
}
}
public static class ListItemTransferable implements Transferable {
public static final DataFlavor LIST_ITEM_DATA_FLAVOR = new DataFlavor(ListItem.class, "java/ListItem");
private ListItem listItem;
public ListItemTransferable(ListItem listItem) {
this.listItem = listItem;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{LIST_ITEM_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(LIST_ITEM_DATA_FLAVOR);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return listItem;
}
}
public static class ListItem {
private String text;
public ListItem(String text) {
this.text = text;
}
public String getText() {
return text;
}
@Override
public String toString() {
return getText();
}
}
}
Java自定义拖放--对TransferHandler没有回调。 我想为JPanel子类实现自定义拖放功能。I遵循标准DnD教程的指导方针: 拖放和数据传输 从表面上看,事情似乎很进步,但当我实际尝试时,我没有得到任何迹象表明任何DnD行为正在发生。事实上,没有调用我的TransferHandler中的任何方法。 所以,让我们回顾一下我所做的... 我创建了自己的容器类,它声明自己来扩展JPane
问题内容: 我是否可以使用标准方法将自己的自定义对象添加到Map,然后将其正确编组到MapMessage中?当前,我收到无效对象类型消息。我注意到WebSphere有解决方案,但是我正在寻找不受特定AS约束的东西,如果没有这种方法,也许JBoss支持的东西会起作用。 如何在WebSphere中进行操作:http : //publib.boulder.ibm.com/infocenter/dmndh
问题内容: 我有一个新闻和一个消息。所述含有选择加入到阵列时teamObjects的的tableView。我想将此数组添加到其中,以便可以从其中包含需要teamObjects的url请求的访问它们。但是我不断得到: “试图为关键团队插入非财产列表对象(“”) 如果有比将其存储在更好的方法,我愿意接受其他建议 方法 我的对象 问题答案: 实际上,您将需要将自定义对象归档到其中,然后将其保存到用户默认
问题内容: 我正在使用TransferHandler将数据从JPanel作为JLabel传递到JTextArea (单击左侧面板中的某处以创建要拖动的JLabel) 数据的传输工作正常,但是我还想“显示” JLabel,因为 它与鼠标指针一起被拖动。 如果您注释掉 您将看到我想要它的外观。(但当然不会传输数据)。 如何既可以进行传输又可以使JLabel跟随鼠标光标? 这是代码: 问题答案: 另一个
问题内容: 我正在尝试在JFrame中使用特殊字体,但遇到了问题。我有一个这样定义的JLabel: 并且我有一个名为CUSTOMFONT-MEDIUM.TTF(TrueType字体)的文件,但是编写了以下内容: 代码会编译,并且一切正常,除了不会显示“ lab”,因此没有文本。我想这是因为我从未指定字体大小,但是我所做的任何尝试都失败了。有人可以帮我吗? 问题答案: 您创建的字体必须先在中注册,以
我正在努力找出如何使用Java流从对象值等于x的自定义对象列表中收集自定义对象。 这没有编译,但我不认为我离得很远--有人能指出我在哪里出错吗?