SWT JFace 拖曳效果

    演示代码如下:

    复制代码 代码如下:

    package swt_jface.demo11;
    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) {
            int operations = DND.DROP_MOVE;
            final DragSource dragSource = new DragSource(label, operations);
            Transfer[] formats = new Transfer[] { TextTransfer.getInstance()};
            dragSource.setTransfer(formats);

            dragSource.addDragListener(new DragSourceListener() {
                public void dragStart(DragSourceEvent event) {
                    if (label.getText().length() == 0)
                        event.doit = false;
                }
                public void dragSetData(DragSourceEvent event) {
                    if (TextTransfer.getInstance().isSupportedType(event.dataType))
                        event.data = label.getText();
                }
                public void dragFinished(DragSourceEvent event) {
                    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);
            Transfer[] formats = new Transfer[] { TextTransfer.getInstance()};
            dropTarget.setTransfer(formats);
            dropTarget.addDropListener(new DropTargetListener() {
                public void dragEnter(DropTargetEvent event) {
                    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);
                        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;
            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();

            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
            display.dispose();
        }
        public static void main(String[] args) {
            new WordJumbles(“ECLIPSE”);
        }
    }

发表评论

发表评论