keine weiteren Events während Drag&Drop Operation möglich?

carbone

Mitglied
Hallo,
meine Umgebung ist folgende:
Windows XP Pro SP3
JRE 1.6.0_21

CrossPosting Hinweis: ich habe das ganze auch bei tutorials.de 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!?

Nier das Fenster:
Java:
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.
 

carbone

Mitglied
Hallo!

Ich dachte das Prinzip wäre klar geworden als ich die Animation Klasse erwähnt habe, denn die macht nicht nur ein einfaches setSize(). Wie der Name schon sagt, wird das Fenster Schritt für Schritt auf die gewünschte Größe vergrößert. Eine Animation eben. Also z.B. von 100 auf 120, aber eben alle 100 Millisekunden um 1.

Ein SwingUtilities.invokeLater() wird in der Animation Klasse realisiert. Auch das direkte zurückgeben in den EDT mit EventQueue.invokeLater() bringt das selbe Ergebnis.

Selbst wenn der Drop außerhalb des Fensters beendet wird, wird das Fenster nur teilweise auf die richtige Größe zurück animiert. Das sieht dann sehr seltsam aus.

Wenn ich dann aber einen Desktop-Link nahe des Fenster ablege, so daß er vom System unterhalb des Fensters positioniert wird, wird das Fenster wieder richtig dargestellt (neu gezeichnet?).

Es liegt irgendwie am DnD Event-Dispatching denke ich, denn wie gesagt wenn ich das ohne DnD nur mit mouseEnter() bzw. mouseExited realisiere funktioniert es wunderbar.

Weitere Ideen?
 

carbone

Mitglied
Hier mal noch die Animations Klassen zum Verständnis:

Animator Klasse:
Java:
import java.awt.Frame;

public class Animator {

	public static final int ANIMATE_WIDTH_ENLARGE = 0x000001;
	public static final int ANIMATE_WIDTH_SHRINK = 0x000002;
	public static final int ANIMATE_HEIGHT_ENLARGE = 0x000003;
	public static final int ANIMATE_HEIGHT_SHRINK = 0x000004;
	public static final int ANIMATE_COMPONENTS_ENLARGE = 0x000010;
	public static final int ANIMATE_COMPONENTS_SHRINK = 0x000011;
	
	private static RAnimatorSize runnable;
	static boolean isAnimating = false;

	public static void setAnimation(final int animation, Frame frame, final int value) {
		switch (animation) {
		case (Animator.ANIMATE_WIDTH_ENLARGE): {
			runnable = new RAnimatorSize(frame, value, 1);
			break;
		}
		case (Animator.ANIMATE_WIDTH_SHRINK): {
			runnable = new RAnimatorSize(frame, value, -1);
			break;
		}
		}
	}

	public static void start(final int speed, final int delay) {
		runnable.setSpeed(speed);
		runnable.setDelay(delay);
		SwingUtilities.invokeLater(runnable);

		//EventQueue.invokeLater(runnable);
		//Thread thread = new Thread(runnable);
		//thread.start();
	}

	public static boolean isAnimating() {
		return Animator.isAnimating;
	}

}

und die RAnimatorSize Klasse:
Java:
import java.awt.Frame;

public class RAnimatorSize implements Runnable {

	private int delay;
	private int speed;
	private Frame window;
	private int width;
	private int step;

	public RAnimatorSize(Frame frame, final int width, final int step) {
		this.window = frame;
		this.width = width;
		this.step = step;
	}

	public void setDelay(final int delay) {
		this.delay = delay;
	}

	public void setSpeed(final int speed) {
		this.speed = speed;
	}

	public void run() {
		Animator.isAnimating = true;
		synchronized (this) {
			try {
				this.wait(delay);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}		
		for (int counter = this.step; counter <= width;) {
			int xCoordinate = (counter % (this.step*2) == 0) ? window.getX()- this.step : window.getX();			
			window.setBounds(xCoordinate, window.getY(), window.getWidth() + this.step, window.getHeight());
			
			synchronized (this) {
				try {
					this.wait(speed);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			counter+= Math.abs(this.step);
		}
		Animator.isAnimating = false;
	}

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation JMenu, setMnemonic(Char k) bringt keine Wirkung AWT, Swing, JavaFX & SWT 8
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
X Swing Anwendung regaiert auf keine Buttons mehr wärend while(scanner.hasNextLine()) ausgeführt wird. AWT, Swing, JavaFX & SWT 4
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
K Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons??? AWT, Swing, JavaFX & SWT 4
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
H RCP(SWT) Browser-Widget zeigt keine locale HTML-Dateien an AWT, Swing, JavaFX & SWT 1
N JavaFX Keine Dynamic AWT, Swing, JavaFX & SWT 2
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
A trotz setSize keine breite AWT, Swing, JavaFX & SWT 4
Q JTable - Keine Spaltennamen AWT, Swing, JavaFX & SWT 3
H Swing Keine Rückmeldung (freeze) bei setVisible(false) oder dispose() AWT, Swing, JavaFX & SWT 4
B JEditorPane lädt keine Schriftfarbe in HTML AWT, Swing, JavaFX & SWT 2
dzim TableView - keine Aktualisierung geänderter Items AWT, Swing, JavaFX & SWT 5
E Keine Ausgabe auf Console und List AWT, Swing, JavaFX & SWT 13
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
N Swing Netbeans 7.1 keine DesktopApplication mehr möglich ? AWT, Swing, JavaFX & SWT 15
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
A Swing JTable benutzt keine Checkbox für Booleans AWT, Swing, JavaFX & SWT 9
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
D Fenster will keine Ausgabe geben>:( AWT, Swing, JavaFX & SWT 3
K Applet erkennt keine Frameverkleinerung AWT, Swing, JavaFX & SWT 5
O keine ähnliche Farben durch Random in Java AWT, Swing, JavaFX & SWT 21
N JFileChooser - Keine Funtkion AWT, Swing, JavaFX & SWT 13
P Kennt awt.list keine Tastatureingabe? AWT, Swing, JavaFX & SWT 3
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
H Swing JScrollPane bekommt keine ScrollBars AWT, Swing, JavaFX & SWT 5
bluerob Nach RowSorter -> Keine Tabellenüberschreibung möglich AWT, Swing, JavaFX & SWT 7
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
aze JTextField:Keine Markierung AWT, Swing, JavaFX & SWT 6
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
Fu3L Keine Transparenten JTextComponents möglich mit Nimbus L&F? AWT, Swing, JavaFX & SWT 5
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
B LayoutManager mischen keine gute Idee? AWT, Swing, JavaFX & SWT 9
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
B JScrollbarPane zeigt keine scrollbars AWT, Swing, JavaFX & SWT 2
I Panel scheint keine Größe zu haben AWT, Swing, JavaFX & SWT 3
aze GridLayout: Keine automatische Ausdehnung AWT, Swing, JavaFX & SWT 2
1 JFrame bleibt leer, keine Ahnung warum AWT, Swing, JavaFX & SWT 7
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
P SWT Tree - Keine Selection zulassen AWT, Swing, JavaFX & SWT 4
T SWT Keine Anzeige der Widgets nach Comboauswahl AWT, Swing, JavaFX & SWT 2
1 GeneralPath-Kreise werden keine Kreise AWT, Swing, JavaFX & SWT 2
hdi Swing setPreferredSize zeigt keine Änderung AWT, Swing, JavaFX & SWT 2
R AWT [Anfänger] keine atives Aussehen von Buttons AWT, Swing, JavaFX & SWT 4
S Seltsames Problem - manchmal enthaelt die ActionMap eine JTextArea keine Actions. AWT, Swing, JavaFX & SWT 4
A SWT Table hat keine Scrollbar AWT, Swing, JavaFX & SWT 12
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6
L Swing JPanel sendet keine KeyEvents AWT, Swing, JavaFX & SWT 22
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
S JDialog gibt keine Nachrichten ueber sein Schliessen..? AWT, Swing, JavaFX & SWT 3
C JTextArea zeigt keine Scrollbalken AWT, Swing, JavaFX & SWT 18
B Heavyweight Popup lässt keine MouseEvents durch AWT, Swing, JavaFX & SWT 2
K JDialog zeigt keine Komponenten wenn es modal ist AWT, Swing, JavaFX & SWT 2
S Seltsam: SWT Table zeigt keine Scrollbar an AWT, Swing, JavaFX & SWT 12
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
G JTable zeigt keine Spaltenheader AWT, Swing, JavaFX & SWT 7
L JDialog-kann keine Größe setzen AWT, Swing, JavaFX & SWT 4
F Thread macht keine Pause AWT, Swing, JavaFX & SWT 22
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Keine Anzeige des Balkens AWT, Swing, JavaFX & SWT 3
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
K keine Zeichenfläche sichtbar AWT, Swing, JavaFX & SWT 2
J ActionListener nimmt keine for()-Schleife? AWT, Swing, JavaFX & SWT 4
M JDialog + JFrame + keine Java Tasse AWT, Swing, JavaFX & SWT 9
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
C Jar Datei ist ausführbar aber zeigt keine icon's an AWT, Swing, JavaFX & SWT 18
S JList gibt nach Sortierung mit Collections keine Anzahl mehr AWT, Swing, JavaFX & SWT 3
N Trotz richtiger ListSelectionMode kann ich keine Zeile sel? AWT, Swing, JavaFX & SWT 4
technolion FileDialog/keine Multi-Selektion vs. JFileCHooser/kein LaF AWT, Swing, JavaFX & SWT 2
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
K Keine SWT-Komponenten-Gruppe in Palette des Visual Editor AWT, Swing, JavaFX & SWT 2
M Keine Buttons oder sonstige Objekte in JFrame unter Linux AWT, Swing, JavaFX & SWT 4
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben