Re: Drag and drop for non
To: comp.lang.java.gui
Hendrik Maryns wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hendrik Maryns schreef:
| Nigel Wade schreef:
| | Hendrik Maryns wrote:
| |
| |> -----BEGIN PGP SIGNED MESSAGE-----
| |> Hash: SHA1
| |>
| |> Hi all,
| |>
| |> IrCOd like to revive a thread I started a while ago but which got no
| |> satisfying answers.
| |>
| |> I want to implement drag and drop for non-String objects.
| |>
| |> Setting: a JList with a DefaultListModel. It contains FormularCOs (a
| |> class of my own making, with a whole hierarchy underneath it:
| |> Conjunction, Negation etc.). I then do
| |>
| |> result.setDragEnabled(true);
| |> result.setTransferHandler(new FormulaTransferHandler());
| |> result.setDropMode(DropMode.INSERT);
| |>
| |> on the JList. Here follows an almost minimal SSCCE, note that it needs
| |> Java 6:
| |>
| |
| | Here you specify that the DataFlavor which drop will accept is of class
| | Formula...
| |
| |
| |> ~ this.localFormulaFlavor = new ActivationDataFlavor(Formula.class,
| |> ~ DataFlavor.javaJVMLocalObjectMimeType, "Arrays of formulas");
| |> ~ }
| |
| |> ~ /**
| |> ~ * The data flavor for formulas local to the JVM.
| |> ~ */
| |> ~ private final DataFlavor localFormulaFlavor;
| |>
| |> ~ /**
| |> ~ * The formulas being transfered.
| |> ~ */
| |> ~ private Object[] transferedFormulas = null;
| |>
| |> ~ @Override
| |> ~ protected Transferable createTransferable(final JComponent c) {
| |> ~ final JList formulaList = (JList) c;
| |> ~ this.transferedFormulas = formulaList.getSelectedValues();
| |> ~ return new DataHandler(this.transferedFormulas,
| this.localFormulaFlavor
| |> ~ .getMimeType());
| |> ~ // TODO: add support via serialization?
| |> ~ }
| |
| | ..but what you actually transfer is an Object[]
|
| I see. What solution would you suggest: convert the Object[] to
| Formula[] and update above also, or simply use Object as the local
| flavor above and let the JList find out? I guess there is no need for
| Formula indeed, since I do not invoke any methods on it, so I could as
| well use Object[].
Not wise. Your drop will accept an array of anything, but you only want to
accept Formula. You should really specify Formula[] in the DataFlavor,
otherwise your canImport() method has to check every entry in the transfer data
to ensure it is a Formula, and that's not good given how often canImport() gets
invoked.
Ok, the latter option now makes the drop being accepted, but nothing
changes, i.e.: everything in the list remains at its place.
Well, you are working with a single JList. Your exportMethod() which ought to
remove elements for MOVE uses getSelectedIndices() to determine what to get rid
of. Does that make sense after you have modified the list in importData(), you
need to verify that? Also, your loop count is wrong, you delete one too few
elements (i < indices.length - 1) so if you only move 1 item it doesn't get
deleted.
--
Nigel Wade
---
* Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24