Automatisches Auslesen der Zwischenablage plattformübergreif

  • Themenstarter Themenstarter jo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

jo

Gast
Hallo!

Ich habe ein Problem beim Arbeiten mit der Zwischenablage mit einem Java-Programm. Vorneweg: Ja, ich habe bereits die Suche des Forums bemüht und keinen entsprechenden Beitrag gefunden, bin überhaupt schon ne Woche an dem Problem dran und heute erst auf das Forum gestoßen.
Möglicherweise ist das Problem dennoch völlig trivial, aber ich komme einfach nicht weiter.

Zur Funktion meines Programms: Beim Starten wird die Systemzwischenablage mit einem Listener versehen, der immer, wenn in einem beliebigen anderen Programm etwas in die Zwischenablage kopiert wird, prüft, ob es sich dabei um Text handelt und wenn ja diesen Text intern weiterverarbeitet.
Unter Windows funktioniert das sehr schön mit folgendem Code. Unter Linux jedoch habe ich das Problem, dass wenn ich z. B. aus Firefox ein Wort kopiere, das Programm das erkennt. OK. Wenn ich dann direkt danach wieder in Forefox etwas kopiere, erkennt mein Programm es nichtmehr. Ich muss erst aus einem andern Programm, gedit o. ä., ein Wort kopieren, das erkennt er dann wieder. Das Problem hatte ich erst auch unter Windows, habe aber einige Codezeilen eingefügt (speziell kommentiert), so dass es da nichtmehr auftrat. Unter Linux bringt das nix.

Code:
    private Clipboard systemClipboard;
...
    private void zwischenablageIntegrieren() {
        systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        // diese beiden Zeilen musste ich einfügen, damit es unter Windows klappt
        Transferable transferData = systemClipboard.getContents(null);
        systemClipboard.setContents(transferData, null);

        FlavorListener zwischenablageUeberwachen = new FlavorListener() {
            public void flavorsChanged(FlavorEvent e) {
                Transferable transferData = systemClipboard.getContents(null);
                for (DataFlavor dataFlavor : transferData.getTransferDataFlavors()) {
                    try {
                        Object content = transferData.getTransferData(dataFlavor);
                        if ((dataFlavor.getMimeType().startsWith("text/plain") && (content instanceof String))) {
                            String inhalt = (String) content;
                            rufeTolleFunktionAuf(inhalt.trim());
                            break;
                        }
                    } catch (Exception a) {
                        System.out.println("Fehler!");
                    }
                }
                // auch diese Zeile musste ich einfügen, damit es unter Windows läuft
                systemClipboard.setContents(transferData, null);
            }
        };

        systemClipboard.addFlavorListener(zwischenablageUeberwachen);
    }

Sieht irgendjemand wo das Problem liegen könnte? Oder hat zumindest eine Ahnung, wie ich dieses plattformspezifische Verhalten in den Griff kriegen könnte?
Schonmal besten Dank für die Hilfe!
 
Ok, das dürfte problematisch werden.
Der Listener wird erstmal nur aktiviert wenn sich der DataFlavor ändert und nicht wenn sich der Content ändert.
Redundante Events können jedoch trotzdem vorkommen auch wenn der Flavor gleich bleibt und sich nur der ändert. (Genau das scheint unter Windows zu passieren)
Speziell unter Linux kommen noch Kompatibiliätsprobleme hinzu da dieses Feature nicht wirklich Cross-Plattform fähig ist.
Ich verweise dich mal an diesen Bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4259272

Vermutlich wird dir nichts anderes übrig bleiben als in einem Thread regelmäßig auf Aktualisierungen zu prüfen :?
Sollte ich mich irren und du eine Lösung finden, sei bitte so nett sie hier Kund zu tun.
 
Ok, schonmal danke Wildcard.
Dem verlinkten Bug entnehme ich, dass man sich schon vor fünf Jahren mit dem Problem rumgeschlagen hat und für nicht-Windows-Systeme keine befriedigende Lösung existiert.

Ich hatte bereits mal mit "SystemSelection" experimentiert, das hat dann wiederum nur unter Linux und nicht unter Windows funktioniert, gleichzeitig aber auch das Programm massiv ausgebremst, weshalb ich das schnell wieder verworfen habe.

Ich werde weiter recherchieren. Sollte sich noch jemand finden, der denkt eine Lösung gefunden zu haben wäre ich sehr dankbar. Denn alles was jetzt an Möglichkeiten bleibt, ist nicht besonders elegant (à la "Timer" etc.).
 
Bin auch schon eine Woche auf der Suche nach einer vernünftigen Lösung um Veränderungen des Clipboards zu überwachen.

Kannst du mir kurz weiterhelfen, denn deine Version

zwischenablageIntegrieren()

funktioniert bei mir nicht immer, oft muss ich 2-3-4 mal etwas kopieren, bis etwas reagiert...

Oder ist das bei dir auch so?

lg c
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben