Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DnD und KDE: Fatale Folgen beim Ziehen auf die Taskleiste

2 views
Skip to first unread message

Ole Streicher

unread,
Jan 28, 2004, 11:54:49 AM1/28/04
to
Hallo,

Wenn ich per Java-Drag-And-Drop ein Objekt auf die KDE-(Linux)-
Taskleiste ziehe, wird offenbar die DnD-Operation nicht korrekt
beendet: Jeder weitere Drag-Versuch endet mit einer Exception der Art

java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress
at sun.awt.dnd.SunDragSourceContextPeer.setDragDropInProgress(SunDragSourceContextPeer.java:313)
at java.awt.dnd.DragSource.startDrag(DragSource.java:285)
at java.awt.dnd.DragSource.startDrag(DragSource.java:402)
at org.dyndns.poch.client.DragSupport.dragGestureRecognized(DragSupport.java:68)
[...]

Danach ist Drag and Drop nicht mehr funktionsfaehig und ich muss das
Java-Programm neu starten.

Kurioserweise passiert das nicht, wenn ich das Objekt nur auf den
Desktop oder in ein Konqueror-Fenster ziehe.

Was koennte der Grund dafuer sein und wie bekommt kann man Java
zwingen, in so einem Fall die Drag/Drop-Operation zu beenden?

Viele Gruesse

Ole

Tobias Vogele

unread,
Jan 28, 2004, 12:34:19 PM1/28/04
to
Hallo,

Ole Streicher spoke:

> Hallo,
>
> Wenn ich per Java-Drag-And-Drop ein Objekt auf die KDE-(Linux)-
> Taskleiste ziehe, wird offenbar die DnD-Operation nicht korrekt
> beendet: Jeder weitere Drag-Versuch endet mit einer Exception der Art
>
> java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress
> at

Kann ich nicht bestätigen, bei mir macht das keine Probleme. Ich hab hier
Kde 3.1.4 unter Suse 9.0 und das Sun-JDK 1.4.2_03.

Grüße,

tobi
--
URL: http://www.wartmal.de Email: ne...@wartmal.de

Ole Streicher

unread,
Jan 29, 2004, 7:30:48 AM1/29/04
to
Hallo Tobias,

Tobias Vogele <ne...@wartmal.de> writes:
>> Wenn ich per Java-Drag-And-Drop ein Objekt auf die KDE-(Linux)-
>> Taskleiste ziehe, wird offenbar die DnD-Operation nicht korrekt
>> beendet: Jeder weitere Drag-Versuch endet mit einer Exception der Art
>> java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress

> Kann ich nicht bestätigen, bei mir macht das keine Probleme. Ich hab hier
> Kde 3.1.4 unter Suse 9.0 und das Sun-JDK 1.4.2_03.

Verblueffend. Das ist praktisch die gleiche Konfiguration wie bei mir:

SuSE 9, KDE 3.1.4, Java VM 1.4.2-b28

Minimalbeispiel:
---------------------------------8<-------------------------------------------
import java.awt.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;

public class DragTest extends JFrame implements DragSourceListener, DragGestureListener {

private DragSource ds = new DragSource();
private String[] items = {"Eins", "Zwei", "Drei"};
private JList jl = new JList(items);

public DragTest() {
getContentPane().add(jl, BorderLayout.CENTER);
DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(
jl, DnDConstants.ACTION_COPY, this);
setVisible(true);
}

public void dragGestureRecognized(DragGestureEvent dge) {
Transferable transferable = new ParameterTransferable(jl.getSelectedValue());
ds.startDrag(dge, DragSource.DefaultCopyDrop, transferable, this);
}

public void dragEnter(DragSourceDragEvent dsde) { }
public void dragExit(DragSourceEvent dse) { }
public void dragOver(DragSourceDragEvent dsde) { }
public void dragDropEnd(DragSourceDropEvent dsde) {
System.out.println("Success: " +dsde.getDropSuccess());
}
public void dropActionChanged(DragSourceDragEvent dsde) { }

public static void main(String args[]) {
new DragTest();
}
}

class ParameterTransferable implements Transferable {
private Object o;
public ParameterTransferable(Object o) { this.o = o; }
public Object getTransferData(DataFlavor flavor) { return o; }
public boolean isDataFlavorSupported(DataFlavor flavor) {
return this.flavor.match(flavor);
}
public DataFlavor[] getTransferDataFlavors() { return flavors; }
static public DataFlavor flavor = new DataFlavor(Object.class, "Alles");
static private DataFlavor[] flavors = { flavor };
}
---------------------------------8<-------------------------------------------

Wenn ich dieses Beispiel kompiliere, starte, ein Item auf die
Taskleiste von KDE ziehe (und zwar z.B. auf die Fensterliste, eins der
dort angezeigten Fenstertitel) und dort loslasse, werden alle
folgenden Operationen mit der erwaehnten InvalidDnDOperation
abgebrochen.

Ist das bei Dir wirklich anders?

Viele Gruesse

Ole

Tobias Vogele

unread,
Jan 29, 2004, 7:50:52 AM1/29/04
to
Hallo,

Ole Streicher spoke:

> Wenn ich dieses Beispiel kompiliere, starte, ein Item auf die
> Taskleiste von KDE ziehe (und zwar z.B. auf die Fensterliste, eins der
> dort angezeigten Fenstertitel) und dort loslasse, werden alle
> folgenden Operationen mit der erwaehnten InvalidDnDOperation
> abgebrochen.
>
> Ist das bei Dir wirklich anders?

Nein, jetzt kann ich das Problem es auch reproduzieren. Ich hatte vorher die
Items immer auf die leere Fläche in der Tastkleiste fallen lassen, nicht
auf einen Fenstertitel.

Leider habe ich auch keine Ahnung, wie man das behebt. :-(

Ortwin Glück

unread,
Jan 29, 2004, 8:50:37 AM1/29/04
to

Ole Streicher wrote:
> Was koennte der Grund dafuer sein und wie bekommt kann man Java
> zwingen, in so einem Fall die Drag/Drop-Operation zu beenden?

Sieht nach einem Bug in KDE aus. Würde mal das KDE-Team darauf ansprechen.

Eventuell kannst du DragSourceContext::dragDropEnd misbrauchen...

Ole Streicher

unread,
Jan 29, 2004, 11:11:16 AM1/29/04
to
Hallo Ortwin,

Ortwin Glück <n...@odi.really.dislikes.spam.ch> writes:
>> Was koennte der Grund dafuer sein und wie bekommt kann man Java
>> zwingen, in so einem Fall die Drag/Drop-Operation zu beenden?
> Sieht nach einem Bug in KDE aus. Würde mal das KDE-Team darauf ansprechen.

Ich glaube auch, dass das irgendwo in dieser Kooperation hakt. Mein
Problem ist aber: kann KDE mir wirklich meine schoene Dropaktion
"zerhauen"? So dass ich nicht mehr die Moeglichkeit habe, sie von Java
aus zu beenden?

> Eventuell kannst du DragSourceContext::dragDropEnd misbrauchen...

Das wird ja in diesem Fall leider nicht aufgerufen. Irgendwie muesste
ich aus der Exception heraus an die eigentliche Operation kommen und
sie beenden koennen. Aber wie?

Viele Gruesse

Ole

Ortwin Glück

unread,
Jan 29, 2004, 1:56:40 PM1/29/04
to

Ole Streicher wrote:
> Ich glaube auch, dass das irgendwo in dieser Kooperation hakt. Mein
> Problem ist aber: kann KDE mir wirklich meine schoene Dropaktion
> "zerhauen"?

Klar. KDE ist in C++ gschrieben. Wenn dort z.B. eine Exception auftritt
und die Entwickler es versäumt haben, das DnD in einem finally korrekt
zu beenden, dann kriegt AWT nie mit, dass es ein Problem gab. Zwar gibt
es in DragSource::startDrag ein
try {
...
} catch(RuntimeException e) {
SunDragSourceContextPeer.setDragDropInProgress(false);
throw e;
}

Doch das hätte man wohl besser so geschrieben:

try {
...
} finally {
SunDragSourceContextPeer.setDragDropInProgress(false);
}

Kommt nun also ein java.lang.Error daher, dann hat der obige Code
nämlich ein Problem....

Falls das passiert müsstest du allerdings den Error auch sehen.

> Das wird ja in diesem Fall leider nicht aufgerufen.

Versuch mal SunDragSourceContextPeer.setDragDropInProgress(false);
händisch aufzurufen.
Du bindest dich aber halt an die Sun-Implementation!

Ole Streicher

unread,
Feb 1, 2004, 6:20:26 AM2/1/04
to
Hallo Ortwin,

Ortwin Glück <n...@odi.really.dislikes.spam.ch> writes:
> Versuch mal SunDragSourceContextPeer.setDragDropInProgress(false);
> händisch aufzurufen.

Hilft leider nichts:

try {
ds.startDrag(dge, cursor, transferable, this);
} catch (java.awt.dnd.InvalidDnDOperationException e) {
sun.awt.dnd.SunDragSourceContextPeer.setDragDropInProgress(false);
ds.startDrag(dge, cursor, transferable, this); // ****
}

erzeugt jetzt bei **** ein

java.awt.dnd.InvalidDnDOperationException: failed to create native peer
at sun.awt.motif.MDragSourceContextPeer.startDrag(MDragSourceContextPeer.java:75)
at sun.awt.dnd.SunDragSourceContextPeer.startDrag(SunDragSourceContextPeer.java:110)
at ****

Und damit kann ich noch weniger anfangen als mit der vorherigen Meldung.

> Du bindest dich aber halt an die Sun-Implementation!

Das waere vorlaeufig ja nicht das Problem; der
KDE-Taskbar-Programmierer wird das Problem ja hoffentlich bald finden
:-)

Viele Gruesse

Ole

0 new messages