tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
427
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MrRock MrRock ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    branne
    Beiträge
    25
    Hallo,
    meine Umgebung ist folgende:
    Windows XP Pro SP3
    JRE 1.6.0_21

    CrossPosting Hinweis: ich habe das ganze auch bei java-forum.org gespostet

    Und ich habe folgendes Problem (egal ob AWT oder SWING):

    ich habe ein DnD von Datein außerhalb meiner Anwendung (z.B. %DESKTOP%\datei.txt) auf das Hauptfenster meiner Anwendung realisiert. Das funktioniert alles optimal.
    Nun möchte ich aber das das ganze auch visulalisiert wird, sprich ich möchte mein Fenster animieren, wenn ein dragEnter() bzw. ein dragExit() stattfindet. Z.B. soll das Fenster bei einem dragEnter() verbreitert und bei einem dragExit() wieder verkleinert werden. Das scheint aber nicht sauber zu funktionieren. Die Animation beim dragEnter() funktioniert sauber. Beim dragExit() jedoch wird zwar das Fenster verkleinert, jedoch scheint das nicht bis "Windows" durchzudringen, da eine Art Schatten bzw. Ghost des Fensters immernoch zu sehen ist.
    Wenn ich die Animation (ohne DnD) nur über mouseEnter() bzw. mouseExited() realisiere funktioniert es wunderbar. Alles wird korrekt gezeichnet. Nun dachte ich mir ich feuere einfach ein MouseEvent bei dragEnter() und dragExit() ab. Naja so leicht ist es nun auch wieder nicht.

    Es scheint also an der noch stattfindenden DnD Operation zu liegen, die bestimmte Events blockiert.
    Ja ich weiß... EventQueue etc. Aber ich kann genau 1 MouseEvent dispatchen während eines DnD. Egal ob MouseEvent.MOUSE_PRESSED oder MouseEvent.MOUSE_EXITED etc., es wird immer nur ein MouseEvent.MOUSE_ENTERED dispatched.


    Ich habe nirgends etwas darüber gefunden wie DnD genau abläuft, und warum bestimmte Events zum Teil blockiert werden.
    Ich denke mal ein DnD auf ein DropTarget ist ein MouseEvent. Wenn der DnD also in ein DropTarget "entered" und solange der Drop nicht abgeschlossen ist ist es nur ein MouseEvent.MOUSE_ENTERED. Und den kann man auch nur genau einmal per Hand weiter-dispatchen!?

    Wie kann ich die Animation sauber realisieren. Habt ihr Ideen?
    Ein händisches repaint aller Komponenten habe ich auch schon probiert. Evtl. aber an der falschen Stelle!?

    Hier das Fenster:
    Code :
    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
    
    public class FrameController implements MouseListener, DropTargetListener {
     
        private static FrameController self;
     
        public static synchronized FrameController getInstance() {
            if (self == null) {
                FrameController.self = new FrameController();
                return FrameController.self;
            }
            return FrameController.self;
        }
     
        private Frame frame;
        private boolean isDragAndDropEvent;
     
        public void show() {
            frame = new Frame();
            frame.setUndecorated(true);
            frame.setBounds((int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2-50),0,100,40);
            frame.addMouseListener(this);
            frame.add(new Label("TEST"));
            frame.setDropTarget(new DropTarget(frame, this));
            frame.setVisible(true);
        }
     
        @Override
        public void mouseClicked(MouseEvent e) {
            //Point mousePointer = frame.getMousePosition(true);
            //frame.dispatchEvent(new MouseEvent(frame, MouseEvent.MOUSE_EXITED, GregorianCalendar.getInstance().getTimeInMillis(), MouseEvent.BUTTON1_DOWN_MASK, mousePointer.x, mousePointer.y, MouseEvent.BUTTON1, false));
        }
     
        @Override
        public void mouseEntered(MouseEvent e) {
            Animator.setAnimation(Animator.ANIMATE_WIDTH_ENLARGE, frame, 40);
            Animator.start(1, 100);
        }
     
        @Override
        public void mouseExited(MouseEvent e) {
            Animator.setAnimation(Animator.ANIMATE_WIDTH_SHRINK, frame, 40);
            Animator.start(1, 100);
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub
            
        }
     
        @Override
        public void mouseReleased(MouseEvent e) {
            
        }
     
        @Override
        public void dragEnter(DropTargetDragEvent dtde) {
            this.isDragAndDropEvent = true;
            Point mousePointer = frame.getMousePosition(true);
            //docklet.dispatchEvent(new MouseEvent(frame, MouseEvent.MOUSE_DRAGGED, GregorianCalendar.getInstance().getTimeInMillis(), MouseEvent.BUTTON1_DOWN_MASK, mousePointer.x, mousePointer.y, MouseEvent.BUTTON1, false));
            this.mouseEntered(new MouseEvent(frame, MouseEvent.MOUSE_ENTERED, GregorianCalendar.getInstance().getTimeInMillis(), MouseEvent.BUTTON1_DOWN_MASK, mousePointer.x, mousePointer.y, MouseEvent.BUTTON1, false));
        
        }
     
        @Override
        public void dragExit(DropTargetEvent dte) {
            //dte.getDropTargetContext().dropComplete (true);
            //Point mousePointer = frame.getMousePosition(true);
            //docklet.dispatchEvent(new MouseEvent(frame, MouseEvent.MOUSE_EXITED, GregorianCalendar.getInstance().getTimeInMillis(), MouseEvent.BUTTON1_DOWN_MASK, mousePointer.x, mousePointer.y, MouseEvent.BUTTON1, false));
            this.mouseExited(null);
     
    /*      SwingUtilities.invokeLater(new Runnable(){
     
                @Override
                public void run() {
                    Point mousePointer = frame.getMousePosition(true);
                    //docklet.dispatchEvent(new MouseEvent(frame, MouseEvent.MOUSE_DRAGGED, GregorianCalendar.getInstance().getTimeInMillis(), MouseEvent.BUTTON1_DOWN_MASK, mousePointer.x, mousePointer.y, MouseEvent.BUTTON1, false));
                    FrameController.getInstance().mouseExited(null);
                }
            });
    */  }
     
        @Override
        public void dragOver(DropTargetDragEvent dtde) {
            // TODO Auto-generated method stub
            
        }
     
        @Override
        public void drop(DropTargetDropEvent dtde) {
            // TODO Auto-generated method stub
            
        }
     
        @Override
        public void dropActionChanged(DropTargetDragEvent dtde) {
            // TODO Auto-generated method stub
            
        }
        
        
     
    }

    Die Animation.java Klasse ist eigentlich zum Verständnins nicht wichtig, da sie nur einen neuen Thread öffnet in dem die Animation abgearbeitet wird. Wie gesagt über Mouse Events geht es wunderbar. Falls ihr sie doch sehen wollt einfach bescheid geben.

    So... danke schonmal für jegliche Hinweise.
     
    YOU? ...and whose army?

  2. #2
    MrRock MrRock ist offline Mitglied Bronze
    Registriert seit
    Jun 2004
    Ort
    branne
    Beiträge
    25
    Noch keine Lösung gefunden!
    Bug der sich nur in der Systemzusammenstellung,wie meiner, äußert.

    weiterzuverfolgen unter: http://forum.fachinformatiker.de/jav...-moeglich.html
     
    YOU? ...and whose army?

Ähnliche Themen

  1. Drag & Drop von RCP nach Windows möglich?
    Von smuehlba im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 30.10.07, 08:18
  2. Events verarbeiten während Schleife
    Von groovemaster im Forum Java
    Antworten: 2
    Letzter Beitrag: 22.08.06, 20:43
  3. axWebBrowser - Drag & Drop Events abfangen?
    Von Blubbie im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 18.05.06, 14:59
  4. SWT: Ghosted Drag-Image bei Drag & Drop
    Von snake_plissken im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 15.04.06, 23:36
  5. nach auswahl von drop down weiteren drop down anzeigen
    Von Nelkenpflanzer im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 29.10.04, 18:59

Stichworte