0

最初に問題を解決したかったプログラムが複雑すぎたので、このドラッグ アンド ドロップの問題を解決するためだけにサンプル プログラムを作成することにしました。

そこで、0 から 100 までの整数で満たされた JTable を使用してプログラムを作成しました。2 番目の列には、単純に column1*2 が表示されています。このテーブルには DragEnabled があります。

同じJPanelJTextAreaに、行をドラッグできる があります。

ドラッグ アンド ドロップ メカニズムを自分で実装できれば、そのプロセスを十分に理解して、他のアプリケーションに実装できます。

私の問題は、どこから始めればよいかわからないことです。私は Web で (公式の 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);
}

}
4

1 に答える 1

0

さて、私は自分で問題を解決することができました。これが私がそれを機能させる方法です:

Transferable を TableData に実装し、2 つの TransferHandler を書きました。1 つはデータのエクスポート用、もう 1 つはデータのインポート用です。

于 2013-05-25T21:10:28.607 に答える