在 Java Swing 中启用 Transfersupport 的 stringFlavor

Enable stringFlavor of Transfersupport in Java Swing(在 Java Swing 中启用 Transfersupport 的 stringFlavor)
本文介绍了在 Java Swing 中启用 Transfersupport 的 stringFlavor的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在实现将 JLabels 的 Textattribute 拖放到 JTable 的单元格中的功能.所以我为表创建了一个自定义的 TransferHandler.但是每次调用

I am implementing a functionality to Drag and Drop the Textattribute of JLabels into the cells of a JTable. So I've created a custom TransferHandler for the table. But every call of

support.isDataFlavorSupported(DataFlavor.stringFlavor) 

返回假

如何确保我的 TransferHandler 能够导入字符串?

How can I make sure that my TransferHandler is able to import Strings?

这里是源码

public class TableHandler extends TransferHandler {
    private static final long serialVersionUID = 1L;

@Override
public boolean canImport(TransferSupport support) {
    if (!support.isDrop()) {
        return false;
    }
    //only Strings
    if(!support.isDataFlavorSupported(DataFlavor.stringFlavor)){
        return false;
    }
    return true;
}

@Override
public boolean importData(TransferSupport support) {
    if (!canImport(support)) {
        return false;
    }

    Transferable tansferable = support.getTransferable();
    String line;
    try {
        line = (String) tansferable
                .getTransferData(DataFlavor.stringFlavor);
    } catch (Exception e) {
        return false;
    }

    JTable.DropLocation dl = (JTable.DropLocation) support
            .getDropLocation();
    int column = dl.getColumn();
    int row = dl.getRow();

    String[] data = line.split(",");
    for (String item : data) {
        if (!item.isEmpty()) {
            table.getTableModel().setValueAt(item, row, column);
        }
    }
    return true;
}
}

推荐答案

检查这个例子似乎工作正常:

Check this example seems to work fine:

JLabels 的任何拖放之前:

Before any dragging / dropping of JLabels:

单击并拖动 Hello JLabel 到第一个单元格:

Clicked and dragged Hello JLabel to 1st cell:

在第一个单元格上释放点击:

On release of click over the first cell:

import java.awt.BorderLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.io.IOException;
import javax.swing.DropMode;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;

public class Test {

    public static void main(String[] args) {
        createAndShowJFrame();
    }

    public static void createAndShowJFrame() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = createJFrame();
                frame.setVisible(true);

            }
        });
    }

    private static JFrame createJFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setTitle("Test");

        JTable table = createJTable();
        JScrollPane js = new JScrollPane(table);

        frame.add(js, BorderLayout.CENTER);

        frame.add(createJLabelPanel(), BorderLayout.SOUTH);

        frame.pack();

        //frame.setResizable(false);//make it un-resizeable
        //frame.setLocationRelativeTo(null);//center JFrame

        return frame;
    }

    private static JTable createJTable() {
        // setup table data
        String[] columns = new String[]{"Foo", "Bar", "Baz", "Quux"};
        String[][] data = new String[][]{{"A", "B", "C", "D"},
            {"1", "2", "3", "4"},
            {"i", "ii", "iii", "iv"}};
        // create table
        final JTable table = new JTable(data, columns);

        // set up drag and drop
        table.setDragEnabled(true);
        table.setDropMode(DropMode.USE_SELECTION);
        table.setFillsViewportHeight(true);

        TransferHandler dnd = new TransferHandler() {
            @Override
            public boolean canImport(TransferSupport support) {
                if (!support.isDrop()) {
                    return false;
                }
                //only Strings
                if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                    return false;
                }
                return true;
            }

            @Override
            public boolean importData(TransferSupport support) {
                if (!canImport(support)) {
                    return false;
                }

                Transferable tansferable = support.getTransferable();
                String line;
                try {
                    line = (String) tansferable.getTransferData(DataFlavor.stringFlavor);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }

                JTable.DropLocation dl = (JTable.DropLocation) support.getDropLocation();
                int column = dl.getColumn();
                int row = dl.getRow();

                String[] data = line.split(",");
                for (String item : data) {
                    if (!item.isEmpty()) {
                        table.getModel().setValueAt(item, row, column);
                    }
                }
                return true;
            }
        };
        table.setTransferHandler(dnd);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        return table;
    }

    private static JPanel createJLabelPanel() {
        JPanel panel = new JPanel();
        JLabel label1 = new JLabel("Hello");
        JLabel label2 = new JLabel("Yay");
        JLabel label3 = new JLabel("Bye");

        MyDragGestureListener dlistener = new MyDragGestureListener();
        DragSource ds1 = new DragSource();
        ds1.createDefaultDragGestureRecognizer(label1, DnDConstants.ACTION_COPY, dlistener);

        DragSource ds2 = new DragSource();
        ds2.createDefaultDragGestureRecognizer(label2, DnDConstants.ACTION_COPY, dlistener);

        DragSource ds3 = new DragSource();
        ds3.createDefaultDragGestureRecognizer(label3, DnDConstants.ACTION_COPY, dlistener);

        panel.add(label1);
        panel.add(label2);
        panel.add(label3);
        return panel;
    }
}

class MyDragGestureListener implements DragGestureListener {

    @Override
    public void dragGestureRecognized(DragGestureEvent event) {
        JLabel label = (JLabel) event.getComponent();
        final String text = label.getText();


        Transferable transferable = new Transferable() {
            @Override
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[]{DataFlavor.stringFlavor};
            }

            @Override
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                if (!isDataFlavorSupported(flavor)) {
                    return false;
                }
                return true;
            }

            @Override
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                return text;
            }
        };
        event.startDrag(null, transferable);
    }
}

这篇关于在 Java Swing 中启用 Transfersupport 的 stringFlavor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)