Swing Drag'n Drop mit nativen Daten, konkret mit Farben?

Robert Zenz

Top Contributor
Jetzt bin ich mal auf ein fuer mich wirklich interessantes Problem gestoszen. Ich wollte meinen color-palette-viewer um die Funktion erweitern dass man die Farben auch in andere Applikationen ziehen kann. In einen Text-Editor ist das einfach, klatscht man ein Transferable mit DataFlavor.stringFlavor dran und es funktioniert.

Jetzt gibt es aber auch Farbwahlknoepfe, zum Beispiel den ColorButton von GTK, und ich haette gerne dass ich Farben aus meinem Farbwaehler direkt auf diese ziehen kann (der Grund ist dass der Farbwahldialog von GTK sowas von schlecht ist dass es mich graust ihn zu verwenden). Text akzeptiert dieser dummerweise keinen, und um herauszufinden was akzeptiert wird habe ich dann einfach die Farbe vom Knopf in meine Applikation gezogen um zu sehen welches Format dies hat.

Der DataFlavor beim Drop besagt dass es sich um application/x-color; class=java.io.InputStream handelt, was ja an und fuer sich ganz nett ist, aber das holen der Daten versagt mit einer Ausnahme.

Code:
java.io.IOException: Unsupported data format: 16
    at sun.awt.X11.XSelection.getData(XSelection.java:415)
    at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
    at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at java.awt.datatransfer.DataFlavor.getReaderForText(DataFlavor.java:845)
    at org.bonsaimind.colorpaletteviewer.gui.ColorPanel$1.drop(ColorPanel.java:114)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
    at sun.awt.X11.XDropTargetContextPeer.processDropMessage(XDropTargetContextPeer.java:184)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4746)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processDropTargetEvent(Container.java:4599)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Fuer Qt gilt im uebrigen das gleiche, gleiches Bild. Passiert sowohl auf JDK 8 als auch 21. Und es gibt keinen anderen Wert den man holen kann, also dort kommt nur application/x-color an.

Das klingt halt schon recht schlecht. Bevor ich jetzt irgendwo noch tiefer im JDK-Code verschwinde wollte ich mal fragen ob jemand mehr Erfahrung im Umgang mit Swing, Drag'n Drop, und arbitraeren Daten hat? Habe ich eine Moeglichkeit diesen Drop entgegen zu nehmen ohne die JDK zu patchen?

Falls es jemand probieren will, hier ist ein ganz einfaches JPanel welches jeglichen Drop annimmt und die Informationen nach stdout schreibt:

Java:
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public final class ColorDropTestMain {
    public static final void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame dropFrame = new JFrame("Drop colors here");
            dropFrame.setSize(800, 600);
            dropFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
            new DropTarget(dropFrame, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetListener() {
                @Override
                public void dragEnter(DropTargetDragEvent dtde) {
                    dtde.acceptDrag(DnDConstants.ACTION_COPY);
                }
              
                @Override
                public void dragExit(DropTargetEvent dte) {
                }
              
                @Override
                public void dragOver(DropTargetDragEvent dtde) {
                }
              
                @Override
                public void drop(DropTargetDropEvent dtde) {
                    dtde.acceptDrop(DnDConstants.ACTION_COPY);
                  
                    for (DataFlavor dataFlavor : dtde.getCurrentDataFlavors()) {
                        System.out.println(dataFlavor.getMimeType());
                      
                        try {
                            System.out.println(dtde.getTransferable().getTransferData(dataFlavor))
                        } catch (Throwable th) {
                            th.printStackTrace();
                        }
                    }
                  
                    dtde.dropComplete(true);
                }
              
                @Override
                public void dropActionChanged(DropTargetDragEvent dtde) {
                }
            });
          
            dropFrame.setVisible(true);
        });
    }
}
 

Robert Zenz

Top Contributor
Wieso wandelszt du das transferable nicht einfach in einen String um?
Das Transferable ist nur ein "Proxy" ueber welchen man die eigentlichen Daten holen kann.

Code:
java.awt.dnd.DropTargetContext$TransferableProxy@653e2da

DAs holen mit einem anderen DataFlavor geht auch nicht, weil nur die verwendet werden koennen welche auch angegeben sind im Drop-Ereignis.

Java:
dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);

Code:
java.awt.datatransfer.UnsupportedFlavorException: Unicode String
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:254)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at ColorDropTestMain$1.drop(ColorDropTestMain.java:42)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
    at sun.awt.X11.XDropTargetContextPeer.processDropMessage(XDropTargetContextPeer.java:184)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4746)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)



Ich muss mich im uebrigen korrigieren, die zum Beispiel passende Ausnahme ist:

Code:
java.io.IOException: Unsupported data format: 16
    at sun.awt.X11.XSelection.getData(XSelection.java:415)
    at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
    at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at ColorDropTestMain$1.drop(ColorDropTestMain.java:42)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
    at sun.awt.X11.XDropTargetContextPeer.processDropMessage(XDropTargetContextPeer.java:184)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4746)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Hatte noch einen anderen Test-Code dabei. Ausnahme ist die selbe, Weg ein anderer.
 

Robert Zenz

Top Contributor
Hast du mal plainTextFlavor probiert bzw. DataFlavor.getReaderForText(Transferable)?
plainTextFlavor wirft java.awt.datatransfer.UnsupportedFlavorException: Unicode String.

Und getReaderForText ist tatsaechlich die Ausnahme aus meiner Frage. Das wirft dann:

Code:
java.io.IOException: Unsupported data format: 16
    at sun.awt.X11.XSelection.getData(XSelection.java:415)
    at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
    at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
 

OpaK

Mitglied
Noch ein Vorschlag von der KI:

Java:
import java.io.DataInputStream;
import java.io.InputStream;

public class ColorParser {
    public static String parseColorStreamToString(InputStream inputStream) throws Exception {
        try (DataInputStream dis = new DataInputStream(inputStream)) {
            // application/x-color nutzt oft 16-Bit pro Kanal (0 - 65535)
            int red = dis.readUnsignedShort();
            int green = dis.readUnsignedShort();
            int blue = dis.readUnsignedShort();
            int alpha = dis.readUnsignedShort();

            // Umrechnung in klassische 8-Bit-Werte (0 - 255)
            int r8 = red >> 8;
            int g8 = green >> 8;
            int b8 = blue >> 8;

            // Ausgabe als lesbarer Hex-String formatiert
            return String.format("#%02X%02X%02X", r8, g8, b8);
        }
    }
}

bzw. (eigenes DataFlavor)

Java:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.io.DataInputStream;
import java.io.InputStream;

public class ClipboardBinaryColorParser {
    public static void main(String[] args) {
        try {
            // 1. Definiere das spezifische DataFlavor für die Binärdaten
            DataFlavor xColorFlavor = new DataFlavor("application/x-color; class=java.io.InputStream");
            
            // 2. Zugriff auf die System-Zwischenablage
            Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            
            // 3. Prüfen, ob das Format aktuell in der Zwischenablage liegt
            if (clipboard.isDataFlavorSupported(xColorFlavor)) {
                
                // 4. Stream abgreifen und parsen
                try (InputStream is = (InputStream) clipboard.getData(xColorFlavor);
                     DataInputStream dis = new DataInputStream(is)) {
                    
                    // Native GUI-Frameworks nutzen meist 16-Bit pro Kanal (Big-Endian)
                    int red = dis.readUnsignedShort();
                    int green = dis.readUnsignedShort();
                    int blue = dis.readUnsignedShort();
                    int alpha = dis.readUnsignedShort();

                    // Bit-Shift: Von 16-Bit (0-65535) auf 8-Bit (0-255) herunterskalieren
                    int r8 = red >> 8;
                    int g8 = green >> 8;
                    int b8 = blue >> 8;

                    // Als klassischen Hex-String formatieren
                    String hexColor = String.format("#%02X%02X%02X", r8, g8, b8);
                    
                    System.out.println("Erfolgreich aus Clipboard geparst: " + hexColor);
                    System.out.println("Rohwerte (16-Bit RGBA): " + red + ", " + green + ", " + blue + ", " + alpha);
                }
            } else {
                System.out.println("Keine 'application/x-color'-Daten in der Zwischenablage vorhanden.");
            }
        } catch (Exception e) {
            System.err.println("Fehler beim Parsen der Zwischenablage: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
 

Robert Zenz

Top Contributor
Das Clipboard hat nichts mit der Drag'n Drop Operation zu tun.

Java:
clipboard.isDataFlavorSupported(xColorFlavor) // -> False

for (DataFlavor dataFlavor : Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors()) {
    System.out.println("Clipboard: " + dataFlavor.getMimeType());
}

Das gibt nur den String zurueck den ich zuletzt kopiert habe, nicht die aktuelle Drag'n Drop Operation.




Java:
DataFlavor xColorFlavor = new DataFlavor("application/x-color; class=java.io.InputStream");

dtde.getTransferable().getTransferData(xColorFlavor);

Code:
java.io.IOException: Unsupported data format: 16
    at sun.awt.X11.XSelection.getData(XSelection.java:415)
    at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
    at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
 

OpaK

Mitglied
Das Clipboard hat nichts mit der Drag'n Drop Operation zu tun.

Du hast acceptDrop vergessen:

Java:
import javax.swing.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.*;
import java.io.DataInputStream;
import java.io.InputStream;

public class ColorDropTargetDemo extends JFrame {

    public ColorDropTargetDemo() {
        setTitle("Color Drop Target");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Panel, auf das die Farbe gezogen werden kann
        JPanel dropPanel = new JPanel();
        JLabel label = new JLabel("Farbe hierher ziehen...");
        dropPanel.add(label);
        add(dropPanel);

        // Drag & Drop Ziel einrichten
        new DropTarget(dropPanel, DnDConstants.ACTION_COPY, new DropTargetAdapter() {
            @Override
            public void drop(DropTargetDropEvent dtde) {
                try {
                    // 1. Spezifischen MIME-Type definieren
                    DataFlavor xColorFlavor = new DataFlavor("application/x-color; class=java.io.InputStream");

                    // 2. Prüfen, ob das Format unterstützt wird
                    if (dtde.isDataFlavorSupported(xColorFlavor)) {
                        dtde.acceptDrop(DnDConstants.ACTION_COPY);
                        
                        // 3. Transferable und Stream holen
                        Transferable transferable = dtde.getTransferable();
                        try (InputStream is = (InputStream) transferable.getTransferedData(xColorFlavor);
                             DataInputStream dis = new DataInputStream(is)) {

                            // 4. Binärdaten auslesen (16-Bit Big-Endian pro Kanal)
                            int red = dis.readUnsignedShort();
                            int green = dis.readUnsignedShort();
                            int blue = dis.readUnsignedShort();
                            int alpha = dis.readUnsignedShort();

                            // 5. Auf 8-Bit (0-255) herunterskalieren
                            int r8 = red >> 8;
                            int g8 = green >> 8;
                            int b8 = blue >> 8;

                            // 6. Als Hex-String formatieren
                            String hexColor = String.format("#%02X%02X%02X", r8, g8, b8);
                            
                            // UI aktualisieren
                            label.setText("Geparschte Farbe: " + hexColor);
                            System.out.println("Drop erfolgreich: " + hexColor);
                        }
                        
                        dtde.dropComplete(true);
                    } else {
                        System.out.println("Format 'application/x-color' nicht unterstützt.");
                        dtde.rejectDrop();
                    }
                } catch (Exception e) {
                    System.err.println("Fehler beim Drop-Parsing: " + e.getMessage());
                    dtde.dropComplete(false);
                }
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ColorDropTargetDemo().setVisible(true));
    }
}
 

Robert Zenz

Top Contributor
Du hast acceptDrop vergessen:
Nein habe ich nicht, wie kommst du auf die Idee?

Java:
@Override
public void drop(DropTargetDropEvent dtde) {
    dtde.acceptDrop(DnDConstants.ACTION_COPY);
    
    for (DataFlavor dataFlavor : Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors()) {
        System.out.println("Clipboard: " + dataFlavor.getMimeType());
    }
    
    for (DataFlavor dataFlavor : dtde.getCurrentDataFlavors()) {
        System.out.println("Drop: " + dataFlavor.getMimeType());
        
        try {
            System.out.println(dtde.getTransferable().getTransferData(new DataFlavor("application/x-color; class=java.io.InputStream")));
        } catch (Throwable th) {
            th.printStackTrace();
        }
    }
    
    dtde.dropComplete(true);
}

Code:
Clipboard: application/x-java-serialized-object; class=java.lang.String
Clipboard: application/rtf; class=java.io.InputStream
Clipboard: text/rtf; class=java.io.InputStream
Clipboard: text/rtf; class=java.nio.ByteBuffer
Clipboard: text/rtf; class="[B"
Clipboard: text/plain; class=java.io.Reader; charset=Unicode
Clipboard: text/plain; class=java.lang.String; charset=Unicode
Clipboard: text/plain; class=java.nio.CharBuffer; charset=Unicode
Clipboard: text/plain; class="[C"; charset=Unicode
Clipboard: text/plain; class=java.io.InputStream; charset=unicode
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=UTF-16
Clipboard: text/plain; class="[B"; charset=UTF-16
Clipboard: text/plain; class=java.io.InputStream; charset=UTF-8
Clipboard: text/plain; class=java.io.InputStream
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=UTF-8
Clipboard: text/plain; class="[B"; charset=UTF-8
Clipboard: text/plain; class=java.io.InputStream; charset=UTF-16BE
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=UTF-16BE
Clipboard: text/plain; class="[B"; charset=UTF-16BE
Clipboard: text/plain; class=java.io.InputStream; charset=UTF-16LE
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=UTF-16LE
Clipboard: text/plain; class="[B"; charset=UTF-16LE
Clipboard: text/plain; class=java.io.InputStream; charset=ISO-8859-1
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=ISO-8859-1
Clipboard: text/plain; class="[B"; charset=ISO-8859-1
Clipboard: text/plain; class=java.io.InputStream; charset=US-ASCII
Clipboard: text/plain; class=java.nio.ByteBuffer; charset=US-ASCII
Clipboard: text/plain; class="[B"; charset=US-ASCII
Drop: application/x-color; class=java.io.InputStream
java.io.IOException: Unsupported data format: 16
    at sun.awt.X11.XSelection.getData(XSelection.java:415)
    at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
    at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
    at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
    at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
    at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
    at ColorDropTestMain$1.drop(ColorDropTestMain.java:53)
    at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
    at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
    at sun.awt.X11.XDropTargetContextPeer.processDropMessage(XDropTargetContextPeer.java:184)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
    at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
    at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
    at java.awt.Component.dispatchEventImpl(Component.java:4746)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Dein Beispiel:

Code:
Fehler beim Drop-Parsing: Unsupported data format: 16
 

OpaK

Mitglied
Dein dragEnter ist noch fehlerhaft.

Java:
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.DataInputStream;
import java.io.InputStream;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public final class ColorDropTestMain {
    public static final void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame dropFrame = new JFrame("Drop colors here");
            dropFrame.setSize(800, 600);
            dropFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
            new DropTarget(dropFrame, DnDConstants.ACTION_COPY_OR_MOVE, new DropTargetListener() {
                
                // Definiere das Flavor explizit mit der erwarteten Java-Klasse
                private final DataFlavor colorFlavor;
                {
                    try {
                        colorFlavor = new DataFlavor("application/x-color; class=java.io.InputStream");
                    } catch (ClassNotFoundException e) {
                        throw new RuntimeException(e);
                    }
                }

                @Override
                public void dragEnter(DropTargetDragEvent dtde) {
                    // Nur akzeptieren, wenn die Quelle auch wirklich eine Farbe anbietet
                    if (dtde.isDataFlavorSupported(colorFlavor)) {
                        dtde.acceptDrag(DnDConstants.ACTION_COPY);
                    } else {
                        dtde.rejectDrag();
                    }
                }
              
                @Override
                public void dragExit(DropTargetEvent dte) {}
              
                @Override
                public void dragOver(DropTargetDragEvent dtde) {}
              
                @Override
                public void drop(DropTargetDropEvent dtde) {
                    if (dtde.isDataFlavorSupported(colorFlavor)) {
                        dtde.acceptDrop(DnDConstants.ACTION_COPY);
                      
                        try (InputStream is = (InputStream) dtde.getTransferable().getTransferData(colorFlavor);
                             DataInputStream dis = new DataInputStream(is)) {
                            
                            // Bytes auslesen (Beispiel für standardmäßige 16-Bit X11/Qt Farben)
                            int r = dis.readUnsignedShort() >> 8;
                            int g = dis.readUnsignedShort() >> 8;
                            int b = dis.readUnsignedShort() >> 8;
                            
                            System.out.format("Erfolgreich geparst: #%02X%02X%02X%n", r, g, b);
                            dtde.dropComplete(true);
                            
                        } catch (Throwable th) {
                            th.printStackTrace();
                            dtde.dropComplete(false);
                        }
                    } else {
                        System.out.println("Unsupported data format aufgerufen.");
                        dtde.rejectDrop();
                    }
                }
              
                @Override
                public void dropActionChanged(DropTargetDragEvent dtde) {}
            });
          
            dropFrame.setVisible(true);
        });
    }
}
 

Robert Zenz

Top Contributor
Willst du mich verarschen? Nichts davon macht einen Unterschied.

Der Drop wurde angenommen, ansonsten kaeme ich an die Ausgabe gar nicht ran.

Ausgabe von deinem neuen Beispiel:

Code:
java.io.IOException: Unsupported data format: 16
	at sun.awt.X11.XSelection.getData(XSelection.java:415)
	at sun.awt.X11.XDnDDropTargetProtocol.getData(XDnDDropTargetProtocol.java:853)
	at sun.awt.X11.XDropTargetContextPeer.getNativeData(XDropTargetContextPeer.java:151)
	at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(SunDropTargetContextPeer.java:264)
	at sun.awt.datatransfer.TransferableProxy.getTransferData(TransferableProxy.java:73)
	at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(DropTargetContext.java:376)
	at ColorDropTestMain$1.drop(ColorDropTestMain.java:54)
	at java.awt.dnd.DropTarget.drop(DropTarget.java:455)
	at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(SunDropTargetContextPeer.java:538)
	at sun.awt.X11.XDropTargetContextPeer.processDropMessage(XDropTargetContextPeer.java:184)
	at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(SunDropTargetContextPeer.java:852)
	at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(SunDropTargetContextPeer.java:776)
	at sun.awt.dnd.SunDropTargetEvent.dispatch(SunDropTargetEvent.java:48)
	at java.awt.Component.dispatchEventImpl(Component.java:4746)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4713)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
 

OpaK

Mitglied

Robert Zenz

Top Contributor
Jetzt habe ich mich doch mal mit dem anderen Weg beschaeftigt, naemlich die Farbe zu senden. Nach etwas gestoebere habe ich mir den Quellcode vom GtkColorButton angesehen wie die das machen, und die bauen sich ein Array aus uint16 um die Farbe zu senden.

C:
  guint16 dropped[4];

  dropped[0] = color_button->priv->color.red;
  dropped[1] = color_button->priv->color.green;
  dropped[2] = color_button->priv->color.blue;
  dropped[3] = color_button->priv->alpha;

  gtk_selection_data_set (selection_data, selection_data->target,
			  16, (guchar *)dropped, 8);

Das passt zu der Fehlermeldung dass das Format mit dem Wert "8" erwartet wird aber "16" empfangen wurde. Die Implementierung in Java unterstuetzt anscheinend nur das.

Das bedeutet fuer mich zwei Dinge: Erstens, es ist sehr wahrscheinlich eine Limitierung in der X11-Bruecke von Java, die einfach niemand bis hier korrigiert hat. Vermutlich werde ich das die Tage noch als Bug einstellen. Zweitens, viel wichtiger, das wuerde ja bedeuten dass ich die Daten korrekt senden kann, an und fuer sich, und das war ja mein Hauptanliegen. Weil beim senden gebe ich einen InputStream raus dessen Inhalt ich ja frei waehlen kann, solange es halt niemand prueft.

Tatsaechlich funktioniert das senden auch in dem ich einen InputStream mit entsprechenden Inhalt baue.

Java:
COLOR_FLAVOR = new DataFlavor("application/x-color; class=java.io.InputStream")

	@Override
	public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
		if (flavor.equals(DataFlavor.plainTextFlavor) || flavor.equals(DataFlavor.stringFlavor)) {
			return color.toHexString();
		} else if (flavor.equals(COLOR_FLAVOR)) {
			return new ByteArrayInputStream(new byte[] {
					0,
					(byte)color.getRed(),
					0,
					(byte)color.getGreen(),
					0,
					(byte)color.getBlue(),
					0,
					(byte)color.getAlpha() });
		}
		
		return null;
	}

Und damit kann ich die Farbe aus meiner Applikation in eine andere, native, auch ziehen.
 
Zuletzt bearbeitet:

OpaK

Mitglied
Ich hab zwar nicht ganz verstanden, in welcher Zeile der Unicode-Fehler auftrat, aber auf Java-Seite müsstet du dann zum Lesen des Color-Streams byte (8 bit) oder char (16 bit) verwenden. Aber Hauptsache ist, es funktioniert jetzt, wie erwartet - nachdem du in die Implementierung von Gtk geschaut hast. 👍

Btw. Aus dem gezeigten Code wird noch nicht ersichtlich, was das "color"-Objekt (oder -Field) ist.
 

Robert Zenz

Top Contributor
Ich muss mich im uebrigen korrigieren, die Komponenten (Rot, Gruen, Blau, Alpha) muessen im Bereich 0..65535 liegen, nicht 0..255. Letzteres geht zwar, aber sowohl GTK als auch Qt uebernehmen dann falsche Werte, vermutlich Rundunsfehler.

Java:
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
	if (flavor.equals(COLOR_FLAVOR)) {
		// "application/x-color" takes a payload of four uint16 values. So
		// the values must be scaled from 0..255 to 0..65535 and then
		// the two most significant bytes must be used to form a uint16
		// value that can be passed on. This uses plain integer arithmetic
		// for the scaling.
		//
		// GTK and Qt actually support receiving values in the range 0..255,
		// but they introduce rounding errors when converting these values.
		int scaledRed = color.getRed() * 65535 / 255;
		int scaledGreen = color.getGreen() * 65535 / 255;
		int scaledBlue = color.getBlue() * 65535 / 255;
		int scaledAlpha = color.getAlpha() * 65535 / 255;
		
		return new ByteArrayInputStream(new byte[] {
				(byte)((scaledRed >>> 0) & 0xff),
				(byte)((scaledRed >>> 8) & 0xff),
				(byte)((scaledGreen >>> 0) & 0xff),
				(byte)((scaledGreen >>> 8) & 0xff),
				(byte)((scaledBlue >>> 0) & 0xff),
				(byte)((scaledBlue >>> 8) & 0xff),
				(byte)((scaledAlpha >>> 0) & 0xff),
				(byte)((scaledAlpha >>> 8) & 0xff) });
	} else if (flavor.equals(DataFlavor.plainTextFlavor) || flavor.equals(DataFlavor.stringFlavor)) {
		return color.toHexString();
	}
	
	return null;
}

Dass man den Drop nicht annehmen kann ich Java habe ich als Bug Report eingereicht, mal sehen ob da was zurueckkommt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JavaFX JavaFX images per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 1
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JavaFX Pane per Drag&Drop bewegen? AWT, Swing, JavaFX & SWT 2
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
F Drag und Drop AWT, Swing, JavaFX & SWT 0
L JavaFX JavaFX Chart Drag and Drop AWT, Swing, JavaFX & SWT 3
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
U Drag and Drop mit imageview AWT, Swing, JavaFX & SWT 0
U Drag and Drop imageviews AWT, Swing, JavaFX & SWT 8
D SteelSeries in Netbeans als Drag-and-Drop einbinden AWT, Swing, JavaFX & SWT 0
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
S Swing Suche Drag & Drop Beispiele AWT, Swing, JavaFX & SWT 1
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
R Drag and Drop Problem auf Jpanel AWT, Swing, JavaFX & SWT 2
N Swing JTable und Drag und Drop AWT, Swing, JavaFX & SWT 2
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
C Drag and Drop (inventar) AWT, Swing, JavaFX & SWT 15
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
R Drag 'n Drop AWT, Swing, JavaFX & SWT 3
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
T Swing Drag and Drop - JLabels tauschen statt überschreiben AWT, Swing, JavaFX & SWT 11
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
B Drag and Drop AWT, Swing, JavaFX & SWT 6
K Drag and Drop Workbench AWT, Swing, JavaFX & SWT 2
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
F SWT Drag and Drop im TreeViewer AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
A TransferHandler & Drag n' Drop AWT, Swing, JavaFX & SWT 2
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
D Drag & Drop - node.isRoot AWT, Swing, JavaFX & SWT 3
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
E Swing Beim Drag & Drop, Drag verbieten?! AWT, Swing, JavaFX & SWT 2
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
M Swing JList > Drag & Drop AWT, Swing, JavaFX & SWT 2
C Drag an Drop vom JTree zur JTable AWT, Swing, JavaFX & SWT 4
Z Drag and Drop auf Application AWT, Swing, JavaFX & SWT 3
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JTable drag and drop AWT, Swing, JavaFX & SWT 4
H Drag&Drop mit GWT AWT, Swing, JavaFX & SWT 8
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
V SWT TreeViewer Drag'n'Drop LocalSelectionTransfer AWT, Swing, JavaFX & SWT 10
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Drag'n'Drop AWT, Swing, JavaFX & SWT 8
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
M Drag & Drop in Swing (createTransferable) AWT, Swing, JavaFX & SWT 6
T Drag Quelle beim Drop AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5
P Dateien per Drag&Drop ins Java-Fenster ziehen AWT, Swing, JavaFX & SWT 8
G JTree Node ggf. aufklappen bei Drag & Drop? AWT, Swing, JavaFX & SWT 7
J Drag'n Drop imm selben Frame unterbinden AWT, Swing, JavaFX & SWT 3
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
X wiedermal Drag n Drop AWT, Swing, JavaFX & SWT 2
P Drag & Drop AWT, Swing, JavaFX & SWT 2
X Drag and Drop AWT, Swing, JavaFX & SWT 2
F Drag&Drop Jlist -> JList AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben