一つの方法:これは、フィールドがテキストを受け入れるが、フィールドに入力してから彼を防止、ユーザーが実際にその焦点を得ることができないようにできるようになります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());
}
}
'field.setFocusable(false)を呼び出すことです;' –