O exemplo neste artigo descreve como Java usa arrastar e soltar do mouse para trocar dados do programa, que é a chamada função arrastar e soltar do mouse. A função arrastar e soltar do mouse é muito comumente usada em sistemas gráficos. Java fornece os pacotes java.awt.dnd e java.awt.datatransfer para suportar esta função. Este exemplo demonstra como implementar arrastar e soltar no programa Quando você clica com o mouse no rótulo “Hello World!” na parte superior da janela e arrasta-o para a caixa de texto na parte inferior da janela, “Hello World!” World!" será adicionado à caixa de texto. !" text; continue com o processo acima e o texto continuará a ser adicionado.
As idéias e métodos específicos de implementação da função do programa são os seguintes: Na implementação do arrastar e soltar do mouse, os dois conceitos mais importantes são a origem do arrastar e o destino do soltar, ou seja, a origem do arrastar e o destino do soltar. A origem de arrastar e o destino de soltar estão associados ao componente visível (como você pode arrastar se não estiver visível?!). A essência da tecnologia de arrastar e soltar é transferir os dados do componente de origem de arrastar e soltar para o componente de destino do posicionamento. Portanto, de uma perspectiva de baixo nível, arrastar e soltar está muito próximo da tecnologia da área de transferência. no exemplo acima.
Implementação da origem de arrastar: a classe de origem de arrastar deve primeiro criar uma instância DragGestureRecognizer, indicando que a classe é uma classe de componente de origem de arrastar ou contém um componente de origem de arrastar. Isso pode ser conseguido chamando o método createDefaultDragGestureRecognizer() do objeto DataSource. A implementação específica é a seguinte:
int action = DnDConstants.ACTION_COPY_OR_MOVE; //Arrastar e soltar tipo ds.createDefaultDragGestureRecognizer(this,action,this);
A instrução acima mostra que o componente de origem do arrasto é um objeto de instância desta classe, o tipo de arrastar e soltar a ser concluído é do tipo DnDConstants.ACTION_COPY_OR_MOVE e a classe que implementa a interface DragGestureListener é esta classe. A origem do arrasto geralmente implementa a interface DragGestureListener, que define um método dragGestureRecognized(). Quando o arrasto é iniciado, o DragGestureListener escuta o evento e, em seguida, transfere para o método dragGestureRecognized() para processar o evento, como enviar os dados do arrasto. fonte. Código específico:
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Método dragGestureRecognized() ainda não implementado."); Texto como dados, por transferível Empacotamento de objetos //Comece a arrastar, defina o cursor para a forma DragSource.DefaultCopyNoDrop, os dados de arrastar e soltar são um objeto tr e DragSourceListener é esta classe dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {err.printStackTrace();}}
A origem do arrasto também deve implementar a interface DragSourceListener, que define métodos de manipulação de eventos para cada estado relacionado ao arrastar e soltar. Como dragEnter, dragOver, dropActionChanged, dragExit e outros métodos. Neste exemplo, o método dragEnter() será implementado para definir a forma do cursor durante o arrastamento, e outros métodos serão métodos vazios. O código de implementação específico é o seguinte:
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Método dragEnter() ainda não implementado.");DragSourceContext dsc = dsde.getDragSourceContext() //Obter a referência de contexto da fonte de arrastar/ / Defina a forma do cursor ao arrastar int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
Implementação do destino para soltar: uma instância DragTarget deve ser criada primeiro na classe de destino para soltar para indicar que esta classe é uma classe de componente de destino para soltar ou contém um componente de destino para soltar.
novo DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
A instrução acima mostra que o destino para soltar é o objeto this.jTextField1, a operação de arrastar e soltar é do tipo DnDConstants.ACTION_COPY_OR_MOVE e a classe que implementa a interface DropTargetListener é esta classe. Correspondente a DrafSourceListener, o destino de soltar ou sua classe geralmente implementa a interface DropTargetListener. Esta interface também define muitos métodos, como dragEnter, dragOver, etc., para lidar com eventos quando o processo de arrastar e soltar entra em diferentes estágios. Este exemplo se preocupa apenas com o método drop(), que é o processamento do evento quando o mouse é liberado no componente de destino do posicionamento. Geralmente é usado para processar os dados passados. exibido no componente JTextField Outros O método é um método vazio, o código específico é o seguinte:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Método drop() ainda não implementado.");try{Transferable tr = dtde.getTransferable(); Processe o objeto de dados e obtenha as informações de texto se (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //Exibir as informações de texto passadas da fonte de arrastar para o destino de soltar dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
Código do programa:
1. Crie um novo projeto e nomeie-o JDragAndDropDemo.
2. Crie um novo aplicativo e nomeie-o como JDragAndDropDemo; nomeie a janela principal como MainFrame e chame-a de JDragAndDropDemo.
3. Crie uma nova classe, nomeie-a como DragJLabel e herde a classe JLabel.
4. Use a interface Wizards|implements para fazer a classe DragJLabel implementar as interfaces DragGestureListener e DragSourceListener.
5. Adicione um novo atributo DragSource ds na classe DragJLabel, o código é o seguinte:
class DragJLabel estende JLabel implementa DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource();
6. Escreva o método construtor da classe DragJLabel.
public DragJLabel(String title,int alinhamento){super(title,alignment); //Use o método da classe pai int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. Implemente o método dragGestureRecognized() na classe DragJLabel, envolva e envie dados.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Método dragGestureRecognized() ainda não implementado.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(Exceção err){err.printStackTrace();}}
8. Implemente o método dragEnter() na classe DragJLabel para definir a forma do cursor.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Método dragEnter() ainda não implementado.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. Adicione um componente JTextField na parte inferior da janela de design da classe MainFrame e crie uma instância DragJLabel na classe. O código específico é o seguinte:
classe pública MainFrame estende JFrame implementa DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Olá Mundo!",SwingConstants.CENTER);……}
10. Escreva o método de inicialização jbInit() da classe MainFrame, defina as propriedades iniciais do componente e crie uma nova instância DropTarget.
private void jbInit() lança exceção {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Seu ícone]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(nova dimensão(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(este .label,BorderLayout.NORTH);novo DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. Use a interface Wizards|implements para fazer a classe MainFrame implementar a interface DropTargetListener.
12. Implemente o método drop() herdado da interface DropTargetListener para processar os dados passados. O código específico é o seguinte:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Método drop() ainda não implementado.");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(Exceção err){ err.printStackTrace();}}