我想首先解决问题的程序很复杂,所以我决定编写一个示例程序来解决这个拖放问题。
所以我用 JTable 编写了一个程序,其中填充了从 0 到 100 的整数。在第二列中,只显示了 column1*2。此表具有 DragEnabled。
同样JPanel
有一个JTextArea
可以将行拖到其上的位置。
如果我现在可以自己实现拖放机制,我会很好地理解该过程以在我的其他应用程序中实现它。
我的问题是我不知道从哪里开始。我在网上阅读了很多资料(也在官方 Java 教程上),但我无法理解。我的问题包括:
- 我需要有一个自定义
TransferHandler
类吗? - 我什么时候实现接口
DropTargetListener
和TransferHandler
?
我必须重写哪种方法来“发送”我的数据以及使用哪种方法来“接收”它?
编辑
嗨,大家好
抱歉,我没有提前发布我的代码。因为它不起作用,我认为它是垃圾,在这里没有用。但:
这是我的代码:
import javax.swing.SwingUtilities;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Windows();
}
});
}
}
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class MyTable extends AbstractTableModel {
private ArrayList<TableData> data;
public MyTable(){
data = new ArrayList<>();
for (int i=0; i<100; i++){
data.add(new TableData());
}
}
public TableData getTableData(int index){
return data.get(index);
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt(int arg0, int arg1) {
if (arg1 == 0){
return data.get(arg0).getValue();
}
return data.get(arg0).getDoubleValue();
}
}
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
public class MyTransferHandler extends TransferHandler {
public MyTransferHandler(){
super();
}
@Override
public int getSourceActions(JComponent c){
return COPY;
}
@Override
public Transferable createTransferable(JComponent c){
return null; //I have absolutely no idea how I could get the selected Row out of the JTable???
}
@Override
public void exportDone(JComponent c, Transferable t, int action){
}
public boolean canImport(TransferSupport t){
return true;
}
@Override
public boolean importData(TransferSupport t){
return true;
}
}
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class TableData implements Transferable{
public static DataFlavor FLAVOR = new DataFlavor(TableData.class, "TableData");
private static int history=0;
private int value;
private int doubleValue;
public TableData(){
value = history;
doubleValue = history*2;
history++;
}
public int getValue(){
return value;
}
public int getDoubleValue(){
return doubleValue;
}
@Override
public Object getTransferData(DataFlavor flavor){
return this;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(FLAVOR);
}
}
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableModel;
public class Windows extends JFrame {
public Windows(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout());
JTable table = new JTable(new MyTable());
table.setDragEnabled(true);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
JTextArea textArea = new JTextArea();
panel.add(textArea);
this.add(panel);
this.pack();
this.setVisible(true);
}
}