|
|
DropMode.USE_SELECTIONDropMode.ONDropMode.INSERTDropMode.ON_OR_INSERT그러나 열거는 다른 구성요소의 특정 모드에 대해 더 커집니다(JTable로 작업할 경우 INSERT_COLS 또는 INSERT_ROWS).
놓기 모드는 어떻게 처리할까요? 기본적으로 이 모드는 USE_SELECTION입니다. 이것은 JTree에서 선택된 항목을 더 이상 강조 표시하지 않음을 의미합니다. 대신 선택 메커니즘을 사용하여 놓기 위치를 강조 표시하십시오. JTree가 놓기를 지원하면 기본값을 변경하는 것이 좋습니다. 더 나은 모드는 ON입니다. 이 모드를 사용하여 JTree 및 잠재적 놓기 위치에서 현재 선택을 모두 확인할 수 있습니다. INSERT 모드를 사용하여 현재 선택 사항을 보면서 기존 노드 사이에 새 노드를 삽입할 수 있습니다. ON_OR_INSERT는 후자 두 개를 결합한 것입니다. 다음 그림 4개는 네 가지 옵션을 보여 줍니다. 완료된 프로그램은 다른 동작을 시도하도록 모드 콤보 상자를 제공합니다.
그림 1. Use Selection |
그림 2. On |
그림 3. Insert |
그림 4. On or Insert |
다음은 놓기 가능한 전체 트리 프로그램입니다. 프로그램에는 중간에 선택하여 JTree에 놓을 수 있는 텍스트 항목의 맨 위에 텍스트 영역이 있습니다. 놓기 모드는 맨 아래의 콤보 상자에서 설정할 수 있습니다. 트리에 대한 데이터 모델은 JTree를 작성할 때 지정되지 않은 경우 작성된 기본 모델에서 나옵니다.
import java.awt.*;import java.awt.datatransfer.*;import java.awt.event.*;import java.io.*;import javax.swing.*;import javax.swing.tree.*;public class DndTree { public static void main(String args[]) { Runnable runner = new Runnable() { public void run() { JFrame f = new JFrame("D-n-D JTree"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel top = new JPanel(new BorderLayout()); JLabel dragLabel = new JLabel("Drag me:"); JTextField text = new JTextField(); text.setDragEnabled(true); top.add(dragLabel, BorderLayout.WEST); top.add(text, BorderLayout.CENTER); f.add(top, BorderLayout.NORTH); final JTree tree = new JTree(); final DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); tree.setTransferHandler(new TransferHandler() { public boolean canImport(TransferHandler.TransferSupport support) { if (!support.isDataFlavorSupported(DataFlavor.stringFlavor) || !support.isDrop()) { return false; } JTree.DropLocation dropLocation = (JTree.DropLocation)support.getDropLocation(); return dropLocation.getPath() != null; } public boolean importData(TransferHandler.TransferSupport support) { if (!canImport(support)) { return false; } JTree.DropLocation dropLocation = (JTree.DropLocation)support.getDropLocation(); TreePath path = dropLocation.getPath(); Transferable transferable = support.getTransferable(); String transferData; try { transferData = (String)transferable.getTransferData( DataFlavor.stringFlavor); } catch (IOException e) { return false; } catch (UnsupportedFlavorException e) { return false; } int childIndex = dropLocation.getChildIndex(); if (childIndex == -1) { childIndex = model.getChildCount(path.getLastPathComponent()); } DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(transferData); DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)path.getLastPathComponent(); model.insertNodeInto(newNode, parentNode, childIndex); TreePath newPath = path.pathByAddingChild(newNode); tree.makeVisible(newPath); tree.scrollRectToVisible(tree.getPathBounds(newPath)); return true; } }); JScrollPane pane = new JScrollPane(tree); f.add(pane, BorderLayout.CENTER); JPanel bottom = new JPanel(); JLabel comboLabel = new JLabel("DropMode"); String options[] = {"USE_SELECTION", "ON", "INSERT", "ON_OR_INSERT" }; final DropMode mode[] = {DropMode.USE_SELECTION, DropMode.ON, DropMode.INSERT, DropMode.ON_OR_INSERT}; final JComboBox combo = new JComboBox(options); combo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int selectedIndex = combo.getSelectedIndex(); tree.setDropMode(mode[selectedIndex]); } }); bottom.add(comboLabel); bottom.add(combo); f.add(bottom, BorderLayout.SOUTH); f.setSize(300, 400); f.setVisible(true); } }; EventQueue.invokeLater(runner); }} |
끌어서 놓기 지원 및 데이터 전송 API에 대한 자세한 내용은 자바 온라인 자습서의 Introduction to Drag and Drop and Data Transfer 내역을 참조하십시오.