我正在尝试将MyObject
拖到JTable
。但是无法找到方法。
我可以获得以下任何一点的帮助吗?(最好是第3点)
** 1. **我发现的唯一好例子是:
指南:http://www.bryanesmith.com/docs/drag-and-drop-java-5/ 资料来源:http://www.bryanesmith.com/docs/drag-and-drop-java-5/DragAndDropPanelsDemo.java
问题在于我得到了:
java.lang.ClassNotFoundException:RandomDragAndDropPanel(line:197)
知道为什么吗?
** 2. **有关其他好例子的任何提示吗?
或** 3. **这是我放在一起的一个例子。但它只显示String
而不显示MyObject
:
我尝试做这项工作的目的是添加:
public static DataFlavor FLAVOR = new DataFlavor(MyObject.class, "My Object");
但我遇到问题implementing Transferable
并将TransferHandler
添加到MyObject
。知道它应该是什么样的吗?
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.DropMode;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;
public class FlavorTest extends JFrame {
// FLAVOR = STRING
private DataFlavor FLAVOR = new DataFlavor(String.class, "DataWrapper");
public FlavorTest() {
// CREATE TABLE
DefaultTableModel model = getDefaultTableModel();
JTable table = new JTable(model);
addDragSupport(table, model);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setDropMode(DropMode.INSERT_ROWS);
table.setFillsViewportHeight(true);
// ADD TABLE AND DRAG OBJECT TO PANEL
JPanel panel = new JPanel();
panel.add(new MyObject("DRAG OBJECT"));
panel.add(table);
// ADD PANEL TO JFRAME
this.add(panel);
this.pack();
this.setDefaultCloseOperation(1);
this.setVisible(true);
}
// CREATE TABLE DATA
private DefaultTableModel getDefaultTableModel() {
String[] cols = { "a", "b", "c" };
String[][] rows = { { "1", "2", "3" } };
return new DefaultTableModel(rows, cols);
}
// SET TRANSFER HANDLER TO TABLE
private void addDragSupport(final JTable table, final DefaultTableModel model) {
table.setTransferHandler(new TransferHandler() {
public boolean canImport(TransferSupport support) {
return true;
}
public boolean importData(TransferSupport support) {
JTable.DropLocation dl = (JTable.DropLocation) support.getDropLocation();
int row = dl.getRow();
Object data;
try {
data = (Object) support.getTransferable().getTransferData(FLAVOR);
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
String[] rowData = data.toString().split(",");
model.insertRow(row, rowData);
return true;
}
});
}
public static void main(String[] args) {
new FlavorTest();
}
// CONTAINS A DRAGABLE JLIST WITH A STRING
private class MyObject extends JPanel {
public MyObject(String text) {
DefaultListModel<String> model = new DefaultListModel<String>();
model.addElement(text);
JList<String> list = new JList<String>(model);
list.setModel(model);
list.setDragEnabled(true);
list.setFocusable(false);
this.add(list);
this.setBorder(BorderFactory.createLineBorder(Color.black));
}
}
}
答案 0 :(得分:2)
仍然不确定究竟是什么问题 - 下面是一个简单的自定义TransferHandler,它允许从列表中拖动项目并将它们放到表格中(每列一个属性)。它的使用非常简单(它在SwingX测试环境中,因为我很懒,只是使用核心组件并投入到框架中)。
JXTable table = new JXTable(0, 2);
DefaultComboBoxModel persons = new DefaultComboBoxModel(
new PersonObject[] { new PersonObject("first", "last"),
new PersonObject("first2", "last2"),
new PersonObject("first3", "last3"), });
JXList list = new JXList(persons);
PersonTransferHandler handler = new PersonTransferHandler();
list.setTransferHandler(handler);
list.setDragEnabled(true);
table.setTransferHandler(handler);
showWithScrollingInFrame(table, list, "custom dnd");
某些自定义类型的自定义处理程序:
/**
* Just an example: can export Person objects from a list an
* import to a table with two columns
*/
public static class PersonTransferHandler extends TransferHandler {
DataFlavor personFlavor = new DataFlavor(PersonObject.class, "PersonObject");
DataFlavor[] flavors = new DataFlavor[] {personFlavor};
/**
* Implemented to return true if the support can provide string values.
*/
@Override
public boolean canImport(TransferSupport support) {
if (!support.isDrop()) {
return false;
}
if (!(support.getComponent() instanceof JTable)) {
return false;
}
return isSupportedType(support);
}
@Override
public boolean importData(TransferSupport support) {
if (!canImport(support)) {
return false;
}
try {
PersonObject person = (PersonObject) support.getTransferable().getTransferData(personFlavor);
Object[] rowData = new Object[]{person.firstName, person.lastName};
JTable table = (JTable) support.getComponent();
((DefaultTableModel) table.getModel()).addRow(rowData);
return true;
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
return false;
}
@Override
protected Transferable createTransferable(JComponent c) {
if (!(c instanceof JList)) return null;
JList list = (JList) c;
final PersonObject person = (PersonObject) list.getSelectedValue();
Transferable t = new Transferable() {
@Override
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return personFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
return person;
}
};
return t;
}
@Override
public int getSourceActions(JComponent c) {
return COPY;
}
private boolean isSupportedType(TransferSupport support) {
DataFlavor[] flavors = support.getDataFlavors();
for (DataFlavor dataFlavor : flavors) {
if (dataFlavor.getRepresentationClass() == PersonObject.class) return true;
}
return false;
}
}
public static class PersonObject {
String firstName;
String lastName;
public PersonObject() {
}
/**
* @param firstName
* @param lastName
*/
public PersonObject(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}