0
我想首先解決問題的程序很複雜,所以我決定寫一個示例程序來解決這個拖放問題。在JTable上實現拖放以自定義JComponent
所以我寫了一個帶有JTable的程序,用0到100的整數填充。在第二列中,顯示了列1 * 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);
}
}
這是一個很好的開始,「寫一個示例程序來解決這個拖放問題。」發佈代碼會更好。 – wchargin
@WChargin對不起。我注意到了我的錯誤並上傳了源代碼。如果有人能幫助我理解這一點,我會很開心 – Christian