이 기사의 예에서는 Java가 마우스 드래그 앤 드롭 기능을 사용하여 프로그램 데이터를 교환하는 방법, 즉 마우스 드래그 앤 드롭 기능을 설명합니다. 마우스의 드래그 앤 드롭 기능은 그래픽 시스템에서 매우 일반적으로 사용됩니다. Java는 이 기능을 지원하기 위해 java.awt.dnd 및 java.awt.datatransfer 패키지를 제공합니다. 이 예제는 프로그램에서 드래그 앤 드롭을 구현하는 방법을 보여줍니다. 창 상단의 "Hello World!" 라벨을 마우스로 클릭하고 창 하단의 텍스트 상자에 드래그하면 "Hello. World!"가 텍스트 상자에 추가됩니다. !" 텍스트가 계속 추가됩니다.
프로그램 기능의 구체적인 구현 아이디어와 방법은 다음과 같습니다. 마우스 드래그 앤 드롭 구현에서 가장 중요한 두 가지 개념은 드래그 소스와 드롭 대상, 즉 드래그 소스와 드롭 대상입니다. 드래그 소스와 드롭 대상은 모두 표시되는 구성 요소와 연결되어 있습니다(표시되지 않는 경우 어떻게 드래그할 수 있습니까?!). 드래그 앤 드롭 기술의 핵심은 드래그 앤 드롭 소스 컴포넌트의 데이터를 배치 대상 컴포넌트로 전송하는 것입니다. 따라서 낮은 수준의 관점에서 드래그 앤 드롭은 클립보드 기술에 매우 가깝습니다. 위의 예에서.
드래그 소스 구현: 드래그 소스 클래스는 먼저 클래스가 드래그 소스 구성 요소 클래스이거나 드래그 소스 구성 요소를 포함하고 있음을 나타내는 DragGestureRecognizer 인스턴스를 만들어야 합니다. 이는 DataSource 객체의 createDefaultDragGestureRecognizer() 메서드를 호출하여 달성할 수 있습니다. 구체적인 구현은 다음과 같습니다.
int action = DnDConstants.ACTION_COPY_OR_MOVE; //드래그 앤 드롭 유형 ds.createDefaultDragGestureRecognizer(this,action,this);
위의 문장은 드래그 소스 컴포넌트가 이 클래스 자체의 인스턴스 객체이고, 완료될 드래그 앤 드롭의 유형이 DnDConstants.ACTION_COPY_OR_MOVE 유형이며, DragGestureListener 인터페이스를 구현하는 클래스가 이 클래스임을 보여줍니다. 드래그 소스는 일반적으로 dragGestureRecognized() 메서드를 정의하는 DragGestureListener 인터페이스를 구현합니다. 드래그가 시작되면 DragGestureListener는 이벤트를 수신한 다음 dragGestureRecognized() 메서드로 전송하여 드래그 데이터 전송과 같은 이벤트를 처리합니다. 원천. 특정 코드:
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("dragGestureRecognized() 메소드가 아직 구현되지 않았습니다."); try{Transferable tr = new StringSelection(this.getText()); 데이터로서의 텍스트, 전송 가능 객체 패키징 //드래그 시작, 커서를 DragSource.DefaultCopyNoDrop 모양으로 설정, 드래그 앤 드롭 데이터는 tr 객체이고 DragSourceListener는 이 클래스입니다 dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {err.printStackTrace();}}
드래그 소스는 드래그 앤 드롭과 관련된 각 상태에 대한 이벤트 처리 방법을 정의하는 DragSourceListener 인터페이스도 구현해야 합니다. dragEnter, dragOver, dropActionChanged, dragExit 및 기타 메소드 등이 있습니다. 이 예제에서는 드래그하는 동안 커서 모양을 설정하기 위해 dragEnter() 메서드를 구현하고 다른 메서드는 빈 메서드로 만듭니다. 구체적인 구현 코드는 다음과 같습니다.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("dragEnter() 메소드가 아직 구현되지 않았습니다.");DragSourceContext dsc = dsde.getDragSourceContext() //드래그 소스의 컨텍스트 참조 가져오기/ / 드래그 시 커서 모양 설정 int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
놓기 대상 구현: 이 클래스가 놓기 대상 구성 요소 클래스이거나 놓기 대상 구성 요소를 포함하고 있음을 나타내려면 놓기 대상 클래스에서 먼저 DragTarget 인스턴스를 만들어야 합니다.
new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
위의 명령문은 놓기 대상이 this.jTextField1 객체이고, 끌어서 놓기 작업이 DnDConstants.ACTION_COPY_OR_MOVE 유형이며, DropTargetListener 인터페이스를 구현하는 클래스가 이 클래스임을 보여줍니다. DrafSourceListener에 따라 드롭 대상 또는 해당 클래스는 일반적으로 DropTargetListener 인터페이스를 구현합니다. 또한 이 인터페이스는 드래그 앤 드롭 프로세스가 다른 단계에 들어갈 때 이벤트를 처리하기 위해 dragEnter, dragOver 등과 같은 많은 메서드를 정의합니다. 이 예제에서는 배치 대상 구성 요소에서 마우스를 놓을 때 처리되는 이벤트인 drop() 메서드에만 관심이 있습니다. 일반적으로 전달된 데이터를 처리하는 데 사용됩니다. JTextField 구성 요소에 표시됩니다. 기타 메서드는 빈 메서드이며 구체적인 코드는 다음과 같습니다.
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("메소드 drop()이 아직 구현되지 않았습니다.");try{Transferable tr = dtde.getTransferable(); //전달된 데이터 객체 가져오기/ / 데이터 객체를 처리하고 다음과 같은 경우 텍스트 정보를 가져옵니다. (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +들); //드롭 소스에서 전달된 텍스트 정보를 드롭 대상에 표시합니다 dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
프로그램 코드:
1. 새 프로젝트를 만들고 이름을 JDragAndDropDemo로 지정합니다.
2. 새 응용 프로그램을 만들고 이름을 JDragAndDropDemo로 지정합니다. 기본 창의 이름을 MainFrame으로 지정하고 JDragAndDropDemo라는 이름을 지정합니다.
3. 새 클래스를 만들고 이름을 DragJLabel로 지정한 다음 JLabel 클래스를 상속합니다.
4. 마법사|구현 인터페이스를 사용하여 DragJLabel 클래스가 DragGestureListener 및 DragSourceListener 인터페이스를 구현하도록 만듭니다.
5. DragJLabel 클래스에 새로운 속성 DragSource ds를 추가합니다. 코드는 다음과 같습니다.
class DragJLabel은 JLabel을 확장하여 DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource() //DragSource 인스턴스 생성...}
6. DragJLabel 클래스의 생성자 메서드를 작성합니다.
public DragJLabel(String title,int alignment){super(title,alignment); //부모 클래스 메소드 사용 int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. DragJLabel 클래스에서 dragGestureRecognized() 메서드를 구현하고 데이터를 래핑하여 보냅니다.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("메소드 dragGestureRecognized()가 아직 구현되지 않았습니다.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(예외 오류){err.printStackTrace();}}
8. DragJLabel 클래스에 dragEnter() 메서드를 구현하여 커서 모양을 설정합니다.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("메소드 dragEnter()가 아직 구현되지 않았습니다.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. MainFrame 클래스의 디자인 창 하단에 JTextField 컴포넌트를 추가하고 클래스에 DragJLabel 인스턴스를 생성합니다. 구체적인 코드는 다음과 같습니다.
공용 클래스 MainFrame은 JFrame 구현 DropTargetListener를 확장합니다. {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Hello World!",SwingConstants.CENTER);…
10. MainFrame 클래스의 초기화 메서드 jbInit()를 작성하고 구성 요소의 초기 속성을 설정한 후 새 DropTarget 인스턴스를 생성합니다. 코드는 다음과 같습니다.
private void jbInit()에서 예외 발생 {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(new Dimension(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(this .label,BorderLayout.NORTH);새 항목 DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. Wizards|implements 인터페이스를 사용하여 MainFrame 클래스가 DropTargetListener 인터페이스를 구현하도록 합니다.
12. 전달된 데이터를 처리하기 위해 DropTargetListener 인터페이스에서 상속된 drop() 메서드를 구현합니다.
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("메소드 drop()이 아직 구현되지 않았습니다.");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(예외 오류){ err.printStackTrace();}}