[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Newsgroup Home]
|
[news.eclipse.platform.swt] problem about SWT drag and drop
|
hi everyone. i'm new to SWT. and i downloaded the source code of the book
<<professional java native interfaces with swt jface>>. but the example
program cannot run properly. any one can point out what's the point? Great
thanks.
the code is
--------------------------------
/*******************************************************************************
* All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie
*
* Created on 2004-4-26 15:46:26 by JACK $Id$
*
******************************************************************************/package com.asprise.books.javaui.ch16;import org.eclipse.swt.SWT;import org.eclipse.swt.dnd.DND;import org.eclipse.swt.dnd.DragSource;import org.eclipse.swt.dnd.DragSourceEvent;import org.eclipse.swt.dnd.DragSourceListener;import org.eclipse.swt.dnd.DropTarget;import org.eclipse.swt.dnd.DropTargetEvent;import org.eclipse.swt.dnd.DropTargetListener;import org.eclipse.swt.dnd.TextTransfer;import org.eclipse.swt.dnd.Transfer;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.graphics.Font;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.widgets.MessageBox;import org.eclipse.swt.widgets.Shell;/** * */public class WordJumbles { Display display = new Display(); Shell shell = new Shell(display); String word; Label[] labelsRowOne; Label[] labelsRowTwo; Font font = new Font(display, "Arial", 18, SWT.BOLD); public void setDragSource(final Label label) { // Allows text to be moved only. int operations = DND.DROP_MOVE; final DragSource dragSource = new DragSource(label, operations); // Data should be transfered in plain text format. Transfer[] formats = new Transfer[] { TextTransfer.getInstance()}; dragSource.setTransfer(formats); dragSource.addDragListener(new DragSourceListener() { public void dragStart(DragSourceEvent event) { // Disallows drags if text is not available. if (label.getText().length() == 0) event.doit = false; } public void dragSetData(DragSourceEvent event) { // Provides the text data. if (TextTransfer.getInstance().isSupportedType(event.dataType)) event.data = label.getText(); } public void dragFinished(DragSourceEvent event) { // Removes the text after the move operation. if (event.doit == true || event.detail == DND.DROP_MOVE) { label.setText(""); } } }); label.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { dragSource.dispose(); } }); } public void setDropTarget(final Label label) { int operations = DND.DROP_MOVE; final DropTarget dropTarget = new DropTarget(label, operations); // Data should be transfered in plain text format. Transfer[] formats = new Transfer[] { TextTransfer.getInstance()}; dropTarget.setTransfer(formats); dropTarget.addDropListener(new DropTargetListener() { public void dragEnter(DropTargetEvent event) { // Does not accept any drop if the label has text on it. if(label.getText().length() != 0) event.detail = DND.DROP_NONE; } public void dragLeave(DropTargetEvent event) { } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void drop(DropTargetEvent event) { if (TextTransfer .getInstance() .isSupportedType(event.currentDataType)) { String text = (String) event.data; label.setText(text); // Checks the result. check(); } } public void dropAccept(DropTargetEvent event) { } }); label.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { dropTarget.dispose(); } }); } private void check() { for(int i=0; i<word.length(); i++) { if(! labelsRowTwo[i].getText().equals(word.charAt(i) + "")) return; } MessageBox messageBox = new MessageBox(shell); messageBox.setMessage("Success!"); messageBox.open(); } public WordJumbles(String word) { this.word = word; shell.setText("Word Jumbles"); labelsRowOne = new Label[word.length()]; labelsRowTwo = new Label[word.length()]; int width = 40; // In the production version, you need to implement random permutation // generation. // Apache Jakarta Commons provides this function, see // org.apache.commons.math.random.RandomDataImpl int[] randomPermutation = { 5, 2, 6, 3, 1, 4, 0 }; for (int i = 0; i < word.length(); i++) { final Label labelRowOne = new Label(shell, SWT.BORDER); labelsRowOne[i] = labelRowOne; labelRowOne.setBounds(10 + width * i, 10, width - 5, width - 5); labelRowOne.setFont(font); labelRowOne.setText(word.charAt(randomPermutation[i]) + ""); labelRowOne.setAlignment(SWT.CENTER); setDragSource(labelRowOne); //setDropTarget(labelRowOne); final Label labelRowTwo = new Label(shell, SWT.BORDER); labelsRowTwo[i] = labelRowTwo; labelRowTwo.setBounds( 10 + width * i, 20 + width, width - 5, width - 5); labelRowTwo.setBackground(display.getSystemColor(SWT.COLOR_WHITE)); labelRowTwo.setFont(font); labelRowTwo.setAlignment(SWT.CENTER); setDragSource(labelRowTwo); //setDropTarget(labelRowTwo); } shell.pack(); shell.open(); //textUser.forceFocus(); // Set up the event loop. while (!shell.isDisposed()) { if (!display.readAndDispatch()) { // If no more entries in event queue display.sleep(); } } display.dispose(); } public static void main(String[] args) { new WordJumbles("ECLIPSE"); }}