Swing JTextfield DnD заменит существующий текст импортированным текстом - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть два текстовых поля, и я могу перетаскивать текст между ними. Я хочу, чтобы каждый раз, когда я перетаскивал текст, он заменял существующие текстовые данные текстом, который перетаскивали.

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 Ответ

3 голосов
/ 02 ноября 2011

Эффект можно получить, создав и установив подкласс 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;
        }
    }
}
...