0

我想首先解决问题的程序很复杂,所以我决定编写一个示例程序来解决这个拖放问题。

所以我用 JTable 编写了一个程序,其中填充了从 0 到 100 的整数。在第二列中,只显示了 column1*2。此表具有 DragEnabled。

同样JPanel有一个JTextArea可以将行拖到其上的位置。

如果我现在可以自己实现拖放机制,我会很好地理解该过程以在我的其他应用程序中实现它。

我的问题是我不知道从哪里开始。我在网上阅读了很多资料(也在官方 Java 教程上),但我无法理解。我的问题包括:

  • 我需要有一个自定义TransferHandler类吗?
  • 我什么时候实现接口DropTargetListenerTransferHandler

我必须重写哪种方法来“发送”我的数据以及使用哪种方法来“接收”它?


编辑


嗨,大家好

抱歉,我没有提前发布我的代码。因为它不起作用,我认为它是垃圾,在这里没有用。但:

这是我的代码:

    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);
}

}
4

1 回答 1

0

好的,我设法自己解决了这个问题。这是我如何让它工作的:

我在TableData中实现了Transferable,写了2个TransferHandler。一种用于导出数据,一种用于导入数据。

于 2013-05-25T21:10:28.607 回答