2011-11-02 34 views
0

我有兩個文本字段,我可以在它們之間拖放文本。我想要的是,每當我拖動文本時,它將用被拖放的文本替換現有的文本數據。Swing JTextfield DnD用導入的文本替換現有文本

import java.awt.Container; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class DragDropText extends JFrame { 

    public static void main(String[] args) { 
     new DragDropText().setVisible(true); 
    } 

    public DragDropText() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTextField field1 = new JTextField("Life's a drag", 20); 
     JTextField field2 = new JTextField("and then you drop", 20); 
     field1.setDragEnabled(true); 
     field2.setDragEnabled(true); 
     Container content = getContentPane(); 

     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
     content.add(field1); 
     content.add(field2); 

     pack(); 
    } 
} 

回答

3

您可以通過創建和設置TransferHandler的子類來實現該效果。

這是一個適用於JTextComponent的任何子類的示例。您必須添加適當的檢查才能使其健壯。

您可以在這裏找到更多信息:http://download.oracle.com/javase/tutorial/uiswing/dnd/transferhandler.html

import java.io.*; 
import java.awt.*; 
import java.awt.datatransfer.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class DragDropText extends JFrame { 

    public static void main(String[] args) { 
     new DragDropText().setVisible(true); 
    } 

    public DragDropText() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JTextField field1 = new JTextField("Life's a drag", 20); 
     JTextField field2 = new JTextField("and then you drop", 20); 
     field1.setDragEnabled(true); 
     field2.setDragEnabled(true); 
     field1.setTransferHandler(new CustomTransferHandler()); 
     field2.setTransferHandler(new CustomTransferHandler()); 

     Container content = getContentPane(); 

     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
     content.add(field1); 
     content.add(field2); 

     pack(); 
    } 
} 

class CustomTransferHandler extends TransferHandler { 
    public int getSourceActions(JComponent c) { 
     return COPY_OR_MOVE; 
    } 

    public Transferable createTransferable(JComponent c) { 
     return new StringSelection(((JTextComponent) c).getSelectedText()); 
    } 

    public void exportDone(JComponent c, Transferable t, int action) { 
     if(action == MOVE) 
      ((JTextComponent) c).replaceSelection(""); 
    } 

    public boolean canImport(TransferSupport ts) { 
     return ts.getComponent() instanceof JTextComponent; 
    } 

    public boolean importData(TransferSupport ts) { 
     try { 
      ((JTextComponent) ts.getComponent()) 
       .setText((String) ts 
         .getTransferable() 
         .getTransferData(DataFlavor.stringFlavor)); 
      return true; 
     } catch(UnsupportedFlavorException e) { 
      return false; 
     } catch(IOException e) { 
      return false; 
     } 
    } 
}