JTextField启用DnD,但无法编辑
问题描述:
我希望能够将选择从JList拖放到JTextField,但是我不想让人能够在对象之后编辑文本已被放入文本框。我得到了免打扰移动,但只有当文本字段已启用,但如果我这样做:JTextField启用DnD,但无法编辑
JTextField field = new JTextField(10);
field.setEnabled(false);
那么我就可以不再对象拖放到文本框,还我只想要一个对象是在现场一次,这就是为什么我不拖入另一个JList。
答
一种方法:使JTextField中不可聚焦通过field.setFocusable(false);
这将使该领域接受的文本,但不允许用户以实际获取其重点,防止他打字进入该领域。
证明的概念代码:
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());
}
}
也许你想要的是调用'field.setFocusable(假);' –