Пример в этой статье описывает, как Java использует перетаскивание мышью для обмена данными программы, что представляет собой так называемую функцию перетаскивания мышью. Функция перетаскивания мыши очень часто используется в графических системах. Java предоставляет пакеты java.awt.dnd и java.awt.datatransfer для поддержки этой функции. В этом примере показано, как реализовать перетаскивание в программе. При нажатии мышкой на метку «Hello World!» в верхней части окна и перетаскивании ее в текстовое поле в нижней части окна «Hello World!» World!" будет добавлено в текстовое поле. !" text; продолжите описанный выше процесс, и текст продолжит добавляться.
Конкретные идеи реализации и методы функции программы заключаются в следующем: При реализации перетаскивания мышью двумя наиболее важными концепциями являются источник перетаскивания и цель перетаскивания, а именно источник перетаскивания и цель перетаскивания. И источник перетаскивания, и цель перетаскивания связаны с видимым компонентом (как можно перетаскивать, если он не виден?!). Суть технологии перетаскивания заключается в передаче данных из исходного компонента перетаскивания в целевой компонент размещения. Поэтому с точки зрения низкого уровня перетаскивание очень близко к технологии буфера обмена. в приведенном выше примере.
Реализация источника перетаскивания. Исходный класс перетаскивания должен сначала создать экземпляр DragGestureRecouncer, указывающий, что класс является классом компонента источника перетаскивания или содержит компонент источника перетаскивания. Этого можно добиться, вызвав метод createDefaultDragGestureRecouncer() объекта DataSource. Конкретная реализация выглядит следующим образом:
int action = DnDConstants.ACTION_COPY_OR_MOVE // Тип перетаскивания ds.createDefaultDragGestureRecouncer(this,action,this);
Приведенный выше оператор показывает, что исходный компонент перетаскивания является объектом экземпляра самого этого класса, тип перетаскивания, который необходимо завершить, имеет тип DnDConstants.ACTION_COPY_OR_MOVE, а класс, реализующий интерфейс DragGestureListener, является этим классом. Источник перетаскивания обычно реализует интерфейс DragGestureListener, который определяет метод dragGestureRecounced(). Когда начинается перетаскивание, DragGestureListener прослушивает событие, а затем передает метод dragGestureRecounced() для обработки события, например отправки данных перетаскивания. источник. Конкретный код:
public void dragGestureRecounced(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Метод dragGestureRecounced() еще не реализован."); try{Transferable tr = new StringSelection(this.getText()); //Переносим метку Текст как данные, от Transferable Упаковка объекта //Начните перетаскивание, установите курсор в форму DragSource.DefaultCopyNoDrop, данные перетаскивания — это объект tr, а DragSourceListener — это класс dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception 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, чтобы указать, что этот класс является классом целевого компонента перетаскивания или содержит целевой компонент перетаскивания. Реализация следующая:
новый 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. Используйте интерфейс Wizards|implements, чтобы класс DragJLabel реализовывал интерфейсы DragGestureListener и DragSourceListener.
5. Добавьте новый атрибут DragSource ds в класс DragJLabel, код следующий:
класс DragJLabel расширяет JLabel, реализует DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource(); //Создаем экземпляр DragSource...}
6. Напишите метод-конструктор класса DragJLabel.
public DragJLabel(String title,int выравнивание){super(title,alignment); //Используем метод родительского класса int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecouncer(this,action,this);
7. Реализуйте метод dragGestureRecounced() в классе DragJLabel, оберните и отправьте данные.
public void dragGestureRecounced(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Метод dragGestureRecounced() еще не реализован.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource) .DefaultCopyNoDrop,tr,this);}catch(Exception ошибка) {err.printStackTrace();}}
8. Реализуйте метод dragEnter() в классе DragJLabel, чтобы задать форму курсора.
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. Добавьте компонент JTextField в нижнюю часть окна дизайна класса MainFrame и создайте экземпляр 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. Напишите метод инициализации jbInit() класса MainFrame, установите начальные свойства компонента и создайте новый экземпляр DropTarget. Код выглядит следующим образом:
Private void jbInit() выдает исключение {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Ваш значок]")));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. Реализуйте метод drop(), унаследованный от интерфейса DropTargetListener, для обработки переданных данных. Конкретный код выглядит следующим образом:
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(Exception err){ err.printStackTrace();}}