2013-05-19 47 views
0

我想首先解決問題的程序很複雜,所以我決定寫一個示例程序來解決這個拖放問題。在JTable上實現拖放以自定義JComponent

所以我寫了一個帶有JTable的程序,用0到100的整數填充。在第二列中,顯示了列1 * 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); 
} 

} 
+0

這是一個很好的開始,「寫一個示例程序來解決這個拖放問題。」發佈代碼會更好。 – wchargin

+0

@WChargin對不起。我注意到了我的錯誤並上傳了源代碼。如果有人能幫助我理解這一點,我會很開心 – Christian

回答

0

好吧,我是自己來解決這個問題。 這是我如何得到它的工作:

我在TableData中實現Transferable並寫了2 TransferHandler。 一個用於導出數據,另一個用於導入數據。