2017-04-04 2 views
-1

JListからJTextFieldに選択範囲をドラッグアンドドロップできるようにしたいのですが、後でそのオブジェクトからテキストを編集できるようにしたくありませんテキストフィールドに入れられました。私はドラッグ&ドロップで移動するようになったんが、テキストフィールドが有効になっている場合にのみ、私は行った場合:JTextFieldはDnDを有効にしますが、編集することはできません

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

それから私はもはやまた、私は1つのオブジェクトのみがフィールドになりたい、テキストフィールドにオブジェクトをドロップすることができます一度に、私は別のJListにドラッグしていない理由です。

+1

'field.setFocusable(false)を呼び出すことです;' –

答えて

3

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