最初に問題を解決したかったプログラムが複雑すぎたので、このドラッグ アンド ドロップの問題を解決するためだけにサンプル プログラムを作成することにしました。
そこで、0 から 100 までの整数で満たされた JTable を使用してプログラムを作成しました。2 番目の列には、単純に column1*2 が表示されています。このテーブルには DragEnabled があります。
同じJPanel
上JTextArea
に、行をドラッグできる があります。
ドラッグ アンド ドロップ メカニズムを自分で実装できれば、そのプロセスを十分に理解して、他のアプリケーションに実装できます。
私の問題は、どこから始めればよいかわからないことです。私は 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);
}
}