2017-04-04 54 views
-1

我希望能夠將選擇從JList拖放到JTextField,但是我不想讓人能夠在對象之後編輯文本已被放入文本框。我得到了免打擾移動,但只有當文本字段已啓用,但如果我這樣做:JTextField啓用DnD,但無法編輯

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

那麼我就可以不再對象拖放到文本框,還我只想要一個對象是在現場一次,這就是爲什麼我不拖入另一個JList。

+1

也許你想要的是調用'field.setFocusable(假);' –

回答

3

一種方法:使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()); 
    } 
}