【问题标题】:JTextField enable DnD, but not able to editJTextField 启用 DnD,但无法编辑
【发布时间】:2017-04-04 21:11:40
【问题描述】:

我希望能够将选择从 JList 拖放到 JTextField,但是我不希望该人能够在将对象放入文本字​​段后编辑对象中的文本。我让 DnD 移动,但前提是启用了文本字段,但如果我这样做:

JTextField field = new JTextField(10);
field.setEnabled(false);

然后我不能再将对象拖放到文本字段中,而且我一次只希望一个对象在字段中,这就是我不拖到另一个 JList 的原因。

【问题讨论】:

  • 也许你想打电话给field.setFocusable(false);

标签: java swing drag-and-drop jlist


【解决方案1】:

一种方法:通过field.setFocusable(false); 使 JTextField 不可聚焦

这将允许该字段接受文本但不允许用户实际获得其焦点,从而阻止他在该字段中输入。

概念证明代码:

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.*;
import javax.swing.text.JTextComponent;

@SuppressWarnings("serial")
public class DragAndDropTest extends JPanel {
    private static final String[] LIST_DATA = {"One", "Two", "Three", "Four", 
            "Five", "Six", "Seven", "Eight", "Nine", "Ten"};

    private JList<String> list = new JList<>(LIST_DATA);
    private JTextField textField = new JTextField(10);

    public DragAndDropTest() {
        list.setVisibleRowCount(6);
        textField.setFocusable(false); // *** here we go! ***
        textField.setTransferHandler(new MyTransferHandler());
        list.setPrototypeCellValue("abcdefghijkl");
        list.setDragEnabled(true);

        add(new JScrollPane(list));
        add(textField);
    }

    private class MyTransferHandler extends TransferHandler {
        @Override
        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        }

        @Override
        public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
            if (Arrays.asList(transferFlavors).contains(DataFlavor.stringFlavor)) {
                return true;
            } else {
                return false;
            }
        }

        @Override
        public boolean importData(TransferSupport support) {
            // allow the JTextField's text to be *replaced* on drop
            try {
                String text = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
                ((JTextComponent) support.getComponent()).setText(text);
                return true;
            } catch (UnsupportedFlavorException | IOException e) {
                return false;
            }
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("DragAndDrop");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DragAndDropTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多