Viele Programme nutzen heutzutage die Eigenschaft Drag and Drop von Programmen. Als Drag and Drop bezeichnet man die Möglichkeit das man Elemente im Computer mit der Maus festhalten kann und woanders hinziehen kann, wie zum Beispiel die Symbole auf dem Desktop. In den letzten 6 Jahre wurde diese Funktion auch für Interaktion mit Programmen entwickelt. Java bietet seit der Version 1.4 eine Unterstützung hierzu an. Das folgende Beispiel zeigt wie man Dateien von einem Programm (Dateimanager) zu einem Java Programm schieben kann. Es wird von der ersten Datei der Namen in einem Label angezeigt und alle weiteren Dateinamen werden in der Konsole ausgegeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package MVC; /** * Hier wird das Programm gestartet. * * @author Kranz Krone * */ public class MVC { private Controller controller; private View view; /** * * @param args Es werden zur Zeit keine Argumente ausgelesen. */ public static void main(String[] args) { new MVC(); } public MVC(){ controller = new Controller(this); view = new View(this); } /** * @return the controller */ public Controller getController() { return controller; } /** * @param controller the controller to set */ public void setController(Controller controller) { this.controller = controller; } /** * @return the view */ public View getView() { return view; } /** * @param view the view to set */ public void setView(View view) { this.view = view; } } |
In dem oberen Codebeispiel wird das Programm gestartet, ein Controller sowie eine View wird initialisiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
package MVC; import java.util.List; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; /** * Hier wird das Programm durch den Computer gemalt. * * @author Kranz Krone * */ public class View extends JFrame { private static final long serialVersionUID = 8151853473421809787L; private MVC mvc; private JMenuBar menuBar = new JMenuBar(); private JMenu file = new JMenu("File"), info = new JMenu("Info"); private JMenuItem j_itm_close = new JMenuItem("Close"); private JMenuItem j_itm_info = new JMenuItem("Imprint"); private JLabel fileLabel = new JLabel(); private JPanel filePanel = new JPanel(); public View(MVC mvc) { this.mvc = mvc; this.setTitle("API Test"); this.setSize(500, 400); // j_itm_close this.file.add(j_itm_close); this.j_itm_close.addActionListener(this.mvc.getController()); this.j_itm_close.setActionCommand("ac_close"); this.info.add(j_itm_info); this.j_itm_info.setActionCommand("ac_info"); this.j_itm_info.addActionListener(this.mvc.getController()); this.menuBar.add(file); this.menuBar.add(info); this.setJMenuBar(this.menuBar); this.addFileLabel(); this.getContentPane().add(this.fileLabel); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); } /** * Hier wird ein Infofenster angezeigt. */ public void showInfo() { JOptionPane.showMessageDialog(this, "(c) 2015 Kranz Krone", "Programminfo", JOptionPane.INFORMATION_MESSAGE); } public void addFileLabel() { fileLabel = new JLabel(); DropTargetListener dropTargetListener = new DropTargetListener() { // Die Maus betritt die Komponente mit // einem Objekt @Override public void dragEnter(DropTargetDragEvent e){} // Die Komponente wird verlassen public void dragExit(DropTargetEvent e){} // Die Maus bewegt sich über die Komponente public void dragOver(DropTargetDragEvent e){} public void drop(DropTargetDropEvent e) { try { Transferable tr = e.getTransferable(); DataFlavor[] flavors = tr.getTransferDataFlavors(); for (int i = 0; i < flavors.length; i++) if (flavors[i].isFlavorJavaFileListType()) { e.acceptDrop(e.getDropAction()); List files = (List) tr.getTransferData(flavors[i]); fileLabel.setText(files.get(0).toString()); // Diesen Code bitte später entfernen! for(int k = 0; k < files.size(); k++) System.out.println(files.get(k).toString()); e.dropComplete(true); return; } } catch (Throwable t) { t.printStackTrace(); } e.rejectDrop(); } @Override public void dropActionChanged(DropTargetDragEvent dtde){} }; DropTarget dropTarget = new DropTarget(fileLabel, dropTargetListener); } } |
In dem oberen Beispiel wird die View aufgebaut. Das Drag and Drop Event sollte hier nicht ausgelesen werden, es gehört eigentlich zum Controller. Es wurde für die Verständlichkeit hier drinnen gelassen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package MVC; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * Hier werden die Programmbefehle gesteuert und die einzelen Teile an das Programmmodel übergeben. Per Observer wird * jeweils auf die Befehler reagiert. * * @author Kranz Krone * */ public class Controller implements ActionListener { private MVC mvc; public Controller(MVC mvc) { this.mvc = mvc; } /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand() == "ac_close"){ System.exit(0); } else if(e.getActionCommand() == "ac_info"){ this.mvc.getView().showInfo(); } } } |