Visualizzazione dei risultati da 1 a 3 su 3

Discussione: JApplet drag drop

  1. #1

    JApplet drag drop

    Buongiorno a tutti,

    è un po' che non scrivo più in questo forum ma ho un problema che forse vuoi potete aiutare a risolvere. Sulla rete sto cercando disperatamente un esempio di DND (Drag&Drop) ma gli esempi che trovo non fanno a caso mio.

    codice:
    package twi609.applet1;
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Applet1 extends JApplet
    {
        private ImageIcon icon, icon2;
        private JLabel label1; 
        private JLabel label2;
        private JLabel label3;
        private GridLayout gridLayout;
        private JPanel panel;
    
        private JButton prescrivi;
    
        @Override
        public void init ()
        {
            //super ("Gestione Unità di Degenza");
            this.setSize (900, 600);
    
            try {
                icon = new ImageIcon ("C:\\blank.gif");
                icon2 = new ImageIcon("C:\\node.jpg");
            } catch (Exception e) {
                System.out.println (e);
            }
    
            gridLayout = new GridLayout(6,2);
    
            label1 = new JLabel ("Letto n°1", icon, SwingConstants.CENTER);
            label2 = new JLabel ("Letto n°2", icon2, SwingConstants.CENTER);
            label3 = new JLabel ("Letto n°3", icon2, SwingConstants.CENTER);
    
            label1.setTransferHandler (new TransferHandler("icon"));
            label2.setTransferHandler (new TransferHandler ("icon"));
            label3.setTransferHandler (new TransferHandler ("icon"));
            
            MouseListener listener = new MouseListener()
            {
                @Override
                public void mousePressed(MouseEvent me)
                {
                    System.out.println("Mouse Pressed");
                    JLabel comp = (JLabel) me.getSource();
                    TransferHandler handler = comp.getTransferHandler();
                    handler.exportAsDrag(comp, me, TransferHandler.MOVE);
                }
    
    
                @Override
                public void mouseReleased(MouseEvent me)
                {
                    System.out.println("Mouse Released");
                }
                
    
                @Override
                public void mouseEntered(MouseEvent me)
                {
                    //System.out.println("Mouse Entered");
                }
    
                @Override
                public void mouseExited(MouseEvent me)
                {
                    //System.out.println("Mouse Exited");
                }
    
                @Override
                public void mouseClicked(MouseEvent me)
                {
                    System.out.println("Mouse Clicked");
                }
            };
    
            label1.addMouseListener(listener);
            label2.addMouseListener(listener);
            label3.addMouseListener(listener);
    
            getContentPane ().add (label1, BorderLayout.NORTH);
            getContentPane ().add (label2, BorderLayout.SOUTH);
            getContentPane ().add (label3, BorderLayout.SOUTH);
    
            prescrivi = new JButton("Prescrivi");
    
    
            panel = new JPanel();
            panel.setBounds(0,0,300,200);//setto le dimensioni del pannello dentro la applet
    
            panel.setLayout(gridLayout);
            panel.setBackground(Color.gray);//setto il colore di sfondo del pannello
    
            //aggiungo al pannello il pulsate di log in e invio messaggio
            panel.add( this.addLoginButton(10,10,10,10,"login all'application") );
            panel.add(this.label1);
            panel.add(this.label2);
            panel.add(this.label3);
    
            this.setContentPane(this.panel);//aggiungo alla applet il pannello
        }
    
       
    
        JButton addLoginButton(int x,int y,int height,int width, String label)
        {
    
           prescrivi = new JButton(label);
           prescrivi.setBounds(x,y,width,height);
           prescrivi.addActionListener(new ActionListener()
                                           {
                                               public void actionPerformed(ActionEvent e)
                                               {
                                                    onLoginButtonClick(e);
                                               }
                                           }
                                        );
           //buttonSendMessage.setVisible(false);
           return prescrivi;
        }
    
        /**instaura la connessione tra applet e application
        */
        private void onLoginButtonClick(ActionEvent e)
        {
            if(e.getSource() == prescrivi)
            {
                System.out.println("Evento");
            }
        }
    }
    Il programma dovrebbe far visualizzare 3 icone, due delle quali sono uguali.
    Quando sposto una icona su un'altra JLabel quest'ultima dovrebbe spostarsi. Non è così purtroppo, il programma ignora tutto questo.


    Se però cambio il codice scrivendo "TransferHandler.COPY" anzichè "TransferHandler.MOVE" l'icona viene effettivamente compiata.

    Ora questo "pezzo" di comportamento può anche andarmi bene ma l'icona di partenza deve cambiare. Dovrei vedere una specie di spostamento dell'immagine ma così non è...

    Qualcuno può aiutarmi perfavore?
    Grazie in anticipo a tutti.

  2. #2
    Cercando e cercando ancora sulla rete ho visto che purtroppo non è possibile il DND di Jlabel di default, come spiegato Guida Javaqui.

    Quello che non riesco a spiegarmi, dato che sono ancora un novellino è come fare per catturare l'evento onMouseOver sopra il JLabel che voglio.

    In pratica vorrei che questa maledetta icona si spostasse...

    Se qualcuno è in grado di darmi una mano ben venga.. io mi sono quasi rassegnato...

  3. #3

    Non so come ci sia riuscito, ma volevo chiudere la discussione postando il codice che mi permette di "spostare" la mia icona:

    codice:
    package it.dndsample;
    
    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.awt.dnd.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.*;
    
    public class DNDSample extends JApplet implements MouseListener
    {
    
        private JPanel panel_letti = new JPanel();
        private JPanel panel_prescrizioni = new JPanel();
        private JPanel panelGenerale = new JPanel();
        private GridLayout gridLayout = new GridLayout(2, 3);
    
        private ImageIcon lettoPieno= new ImageIcon("C:\\lettoPieno.jpg");
        private ImageIcon lettoVuoto= new ImageIcon("C:\\lettoVuoto.jpg");
        private JLabel pieno = new JLabel("Gino",lettoPieno,JLabel.CENTER);
        private JLabel vuoto = new JLabel("Pino",lettoVuoto,JLabel.CENTER);
        private JLabel mezzo = new JLabel("Rino",lettoVuoto,JLabel.CENTER);
    
        private JLabel passaggio;
    
    	private DragGestureListener dragHandler = new DragGestureListener()
        {
            public void dragGestureRecognized(DragGestureEvent evt)
            {
                System.out.println("Drag...");
                //String data = "Hello World";
                passaggio = (JLabel) evt.getComponent();
                MyTransfer trans = new MyTransfer(passaggio);
                System.out.println(passaggio.toString());
                evt.startDrag(DragSource.DefaultMoveDrop, trans);
            }
    	};
    
    
    	private DropTargetListener dropHandler = new DropTargetAdapter()
        {
            JLabel data = new JLabel();
            public void drop(DropTargetDropEvent evt)
            {
    			System.out.println("Drop...");
    			if(evt.isDataFlavorSupported(MyTransfer.FLAVOR))
                {
    
    				Transferable t = evt.getTransferable();
                    DropTargetContext dropTargetContext = evt.getDropTargetContext();
                    JLabel component = (JLabel)dropTargetContext.getComponent();
    
    				try
                    {
    					evt.acceptDrop(DnDConstants.ACTION_COPY);
                        data = (JLabel) t.getTransferData(MyTransfer.FLAVOR);
                        data.setIcon(lettoVuoto);
                        component.setIcon(lettoPieno);
                        System.out.println(component.toString());
                        panel_letti.updateUI();
                        evt.dropComplete(true);
    				} 
                    catch(UnsupportedFlavorException e)
                    {
    					evt.dropComplete(false);
    					throw new InternalError();
    				} 
                    catch(java.io.IOException e)
                    {
    					evt.dropComplete(false);
    					throw new InternalError();
    				}
    			}
                else
                {
                    System.out.println("Non posso Droppare il file");
    				evt.rejectDrop();
                }
    		}
    	};
    
    
        @Override
        public void init()
        {
            DragSource ds = new DragSource();
            ds.createDefaultDragGestureRecognizer(pieno, DnDConstants.ACTION_MOVE, dragHandler);
            ds.createDefaultDragGestureRecognizer(vuoto, DnDConstants.ACTION_MOVE, dragHandler);
            ds.createDefaultDragGestureRecognizer(mezzo, DnDConstants.ACTION_MOVE, dragHandler);
            //
            //ds.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_MOVE, dragHandler);
            //DropTarget dt = new DropTarget(dropLabel, dropHandler);
    
            DropTarget dt = new DropTarget(vuoto, dropHandler);
            DropTarget dt1 = new DropTarget(pieno, dropHandler);
            DropTarget dt2 = new DropTarget(mezzo, dropHandler);
            
    
            final Dimension SIZE = new Dimension(100, 100);
    
            panel_prescrizioni.setBackground(Color.BLUE);
    
            
            pieno.setPreferredSize(SIZE);
            vuoto.setPreferredSize(SIZE);
            mezzo.setPreferredSize(SIZE);
    
            pieno.setText("Pieno");
            mezzo.setText("Mezzo");
            vuoto.setText("Vuoto");
    
            panel_letti.add(pieno);
            panel_letti.add(vuoto);
            panel_letti.add(mezzo);
    
            
            pieno.setTransferHandler(new TransferHandler("icon"));
            mezzo.setTransferHandler(new TransferHandler("icon"));
            vuoto.setTransferHandler(new TransferHandler("icon"));
    
            pieno.addMouseListener(this);
            vuoto.addMouseListener(this);
            mezzo.addMouseListener(this);
    
            panelGenerale.setLayout(gridLayout);
            panelGenerale.add(panel_letti);
            panelGenerale.add(panel_prescrizioni);
    
            this.setContentPane(this.panelGenerale);
    	}
    
        public void mouseClicked(MouseEvent e) {
            System.out.println("mouseClicked");
        }
    
        public void mousePressed(MouseEvent e) {
            System.out.println("mousePressed");
            //JLabel c = (JLabel)e.getSource();
            //TransferHandler th = c.getTransferHandler();
            //th.exportAsDrag(c, e, TransferHandler.COPY);
        }
    
        public void mouseReleased(MouseEvent e) {
            System.out.println("mouseReleased");
    
            
        }
    
        public void mouseEntered(MouseEvent e) {
            //System.out.println("mouseEntered");
            JLabel lab = (JLabel) e.getSource();
            System.out.println(lab.getIcon().toString());
        }
    
        public void mouseExited(MouseEvent e) {
            //System.out.println("mouseExited");
        }
    }
    Includiamo anche il file MyTransfer.java...

    codice:
    package it.dndsample;
    
    import java.awt.datatransfer.*;
    
    public class MyTransfer implements Transferable {
    	public static final DataFlavor FLAVOR;
    	static {
    		try {
    			FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType);
    		} catch(ClassNotFoundException e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	private Object data;
    
    	public MyTransfer(Object d) {
    		data = d;
    	}
    
    	public Object getTransferData(DataFlavor f) throws UnsupportedFlavorException {
    		if(f == FLAVOR) return data;
    		throw new UnsupportedFlavorException(f);
    	}
    
    	public boolean isDataFlavorSupported(DataFlavor f) {
    		return f == FLAVOR;
    	}
    
    	public DataFlavor[] getTransferDataFlavors() {
    		return new DataFlavor[] {FLAVOR};
    	}
    }
    le immagini del letto pieno (occupato) e vuoto potete tranquillamente trovarle in giro..
    Spero possa dare la mano a qualcuno...

    Saluti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.