Swing JTextfield DnD replace the existing text with the imported text

大兔子大兔子 提交于 2019-12-11 15:09:50

问题


I have two text fields and I can drag and drop the text between them. What I want is that every time I drag the text it will replace the existing text data with the text which was dragged and dropped.

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();
    }
}

回答1:


You can achieve the effect by creating and setting a subclass of TransferHandler.

This is an example that will work for any subclass of JTextComponent. You'll have to add the appropriate checks to make it robust.

You can find more info here: 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;
        }
    }
}


来源:https://stackoverflow.com/questions/7976972/swing-jtextfield-dnd-replace-the-existing-text-with-the-imported-text

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!