2013-05-19 1 views
0

먼저 문제를 해결하고 싶은 프로그램은 복잡하기 때문에이 드래그 앤 드롭 문제를 해결하기위한 샘플 프로그램을 작성하기로했습니다.JTable의 드래그 앤 드롭을 커스텀 JComponent에 구현하기

그래서 JTable을 사용하여 0에서 100까지의 정수로 채워진 프로그램을 작성했습니다. 두 번째 열에서는 단순히 column1 * 2가 표시됩니다. 이 테이블에는 DragEnabled가 있습니다.

동일한 JPanel에는 행을 드래그 할 수있는 JTextArea이 있습니다.

이제 드래그 앤 드롭 메커니즘을 직접 구현할 수 있다면 다른 응용 프로그램에서도 구현할 수있을만큼 프로세스를 이해할 수 있습니다.

제 문제는 어디에서 시작해야할지 모르겠다는 것입니다. 나는 웹에서 많은 것을 읽었지만 (공식 자바 자습서에서도) 나는 그것을 이해할 수 없었다. 제 질문은 다음과 같습니다 :

  • 맞춤형 TransferHandler 클래스가 있어야합니까?
  • DropTargetListenerTransferHandler 인터페이스는 언제 구현합니까?

내 데이터를 "보내려면"어떤 방법을 사용해야하고 어떤 데이터를 "수신"할 수 있습니까?


편집


안녕 얘들 아

내가 먼저 사전에 내 코드를 게시하지 않았다 죄송합니다. 그것이 작동하지 않았기 때문에 나는 쓰레기라는 것을 알았지 만 여기서는 쓸모가 없다. 그러나 :

Heres는 내 코드 :

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를 작성했습니다. 데이터 내보내기 용이고 데이터 가져 오기 용입니다.

관련 문제