Auslesen der Zwischenablage - Optimierung Geschwindigkeit

Tschop

Mitglied
Hallo Zusammen,

ich habe eine Frage zum Thema Auslesen der Zwischenablage.
Ich habe ein Java Programm geschrieben das unter anderem ein jTable enthält.
Ich will in einer Exceltabelle bestimme Einträge kopieren und über einen Button im Java Programm diese in die jTable schreiben.

Aus verschiedenen Gründen musste ich von Netbeans (wo ich ursprünglich angefangen habe) auf Eclipse umsteigen.
Komischerweise dauert das Einfügen aus der Zwischenablage jetzt relativ lange (ca 3-5 Sekunden). Dabei wurde der Inhalt vorher quasi mit dem Mausklick angezeigt.

Wisst Ihr vielleicht woran das liegen kann bzw wie man die Geschwindigkeit beim Einfügen aus der Zwischenablage erhöhen kann? Ist das vielleicht eine Compilersache von Eclipse?

Die Funktionen für das Einfügen habe ich im Internet gefunden und an meine Tabelle angepasst.

Beim Einfügen handelt es sich nicht um große Datensätze. Es sind 7 Spalten und in der Regel etwa 10 Datensätze.



Java:
private void putintotable() throws UnsupportedFlavorException, IOException{
        
        Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable transfer = sysClip.getContents(null);
        String data = (String) transfer.getTransferData(DataFlavor.stringFlavor);
              
        int col = 0, row = 0;
        for (int i = 0;i<data.length();i++){
            if (data.charAt(i) == '\t'){
                //neue Zelle
                String tempStr = data.substring(0,i);
                jTable1.setValueAt(tempStr, row, col);
                col++;
                data = data.substring(i+1,data.length());
                i = 0;
            }
            if(data.charAt(i) == '\n'){
                //neue Zeile
                String tempStr = data.substring(0,i);
                jTable1.setValueAt(tempStr,row,col);
                row++;
                col = 0;
                data = data.substring(i+1,data.length());
                i = 0;
            }
        }
        System.out.println(data);
        rowcount = row;
        
        
    }

Vielen Dank für die Hilfe!

Andreas Rolf
 
wie groß ist der String?
messe durch Ausgaben in Zeile 2, 6 und 29, ob allein das Erhalten des reinen Strings lange dauert oder deine restlichen Aktionen danach,
komplett unabhängig von der Zwischenablage

unter den restlichen fällt das häufige subString auf,
bei kleinen Texten bis wenige tausend Zeichen dürfte das auf heutigen Rechnern nicht zu spüren sein,
bei MB schon eher, wobei die Strings immerhin kleiner werden, das erfordert hoffentlich nicht ständiges Umkopieren sämtlicher Daten,
mindestens aber das Anlegen Millionen einzelner Objekte,

durchlaufe den String lieber einmal von Anfang bis Ende, merke dir Zeilenanfänge usw. in Indexvariablen, die auch > 0 sein können
 
Vielen Dank für die schnelle Antwort.
Ich habe jetzt mal die Zeit gemessen und der Schritt
Code:
Transferable transfer = sysClip.getContents(null);
benötigt quasi 99% der Zeit.

Daran kann man vermutlich aber nicht viel ändern oder?
Komisch ist nur das es vorher bei Netbeans quasi mit dem Mausklick erledigt war und nun 3-5 Sekunden braucht.

Der String hat etwa 1000 Zeichen.
 
ungünstig für mich, dann stehe ich praktisch ohne Tipps da,
Internet-Suche auch nicht so ergiebig

hier ein Link mit einer recht naheliegenden Idee, die das Problem zwar nicht direkt angeht, aber vielleicht vorerst abmildert
Clipboard woes

nicht erst mit einem Buttonklick oder so die Zwischenablage abfragen, sondern mit einem Thread im Hintergrund,
der entweder sofort bei neuen Daten in Zwischenablage oder mindestens direkt ab Focus fürs Programm aktiv wird,

wenn der Benutzer paar Sekunden braucht bis irgendwo die Daten eingefügt werden sollen, sind sie vielleicht schon geladen,
bei ständig Excel, Klick, Java, Klick, Excel, Klick usw. Wechsel hilft es natürlich nicht ganz so sehr

vielleicht wird aber sogar die Hälfte der Klicks eingespart, wenn man die Java-Hälfte der Arbeit im Hintergrund automatisiert,

so, das reicht wohl als immerhin etwas Input in diesem Thread 😉
warum langsam oder nicht kann ich direkt nicht weiter beurteilen
 
Habe Deinen Code bei mir mit Eclipse laufen gehabt (Java 7, Windows 7 Enterprise). Ich habe die von Dir beobachtete Langsamkeit nicht reproduzieren können. Daher habe auch ich keine Performancetipps. Aaaber ich habe Code geschrieben, der etwas einfacher die Zwischenablage zeilenweise einliest. Vielleicht magst Du ihn ja auch lieber als Deinen 😉:
Java:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.BufferedReader;
import java.io.Reader;

public class TestApp {

  public static void main(String[] args) throws Exception {

    final Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();

    final Transferable transfer = sysClip.getContents(null);

    final Reader transferReader = DataFlavor.stringFlavor
        .getReaderForText(transfer);

    final BufferedReader bufferedReader = new BufferedReader(transferReader);

    String line = null;

    while ((line = bufferedReader.readLine()) != null) {
      // Hier der ganze Code für das Processing einer Zeile
      // Bis dahin erstmal System.out.println
      System.out.println(line);
    }

    bufferedReader.close();

  }
}
 
Vielen Dank für eure Antworten!

Das mit dem parallelen Überprüfen der Zwischenablage, gerade wenn das Fenster zum Kopieren minimierst ist, würde bestimmt helfen. Bin mir gerade noch nicht so sicher wie ich das mit den Threads umsetze aber ich werd es mal versuchen.

Vll noch eine Anmerkung aus der ich nicht schlau werde:
Wenn ich das Programm starte, in Excel 10 Zeilen kopiere und auf den Button gehe, läd er ca. 5 Sekunden.
Wenn ich Das Programm dann komplett schließe und erneut starte, funktioniert die Funktion sofort.(sofern nichts neues in die Zwischenablage geladen wird)

Könnt ihr mir erklären weshalb das so ist? Normalweise werden doch bei einem kompletten Programmneustarten die selben Befehler nochmal ausgeführt. Somit müsste es doch wieder die 5 Sekunden dauern?

Mit freundlichen Grüßen

Andreas Rolf
 
Vll noch eine Anmerkung aus der ich nicht schlau werde:
Wenn ich das Programm starte, in Excel 10 Zeilen kopiere und auf den Button gehe, läd er ca. 5 Sekunden.
Wenn ich Das Programm dann komplett schließe und erneut starte, funktioniert die Funktion sofort.(sofern nichts neues in die Zwischenablage geladen wird)

Könnt ihr mir erklären weshalb das so ist? Normalweise werden doch bei einem kompletten Programmneustarten die selben Befehler nochmal ausgeführt. Somit müsste es doch wieder die 5 Sekunden dauern?
Habe meinen Code noch um ein Userereignis ergänzt:
Java:
    final Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();

    final Scanner scanner = new Scanner(System.in);

    // Habe keine Swing-Gui. Das hier ist der Ersatz
    // für das User-Ereignis "Klick auf den Ladebutton".
    // Es wird auf ein Return in der Console gewartet.
    scanner.nextLine();

    //...der restliche Code...
Ich habe dann -wie von Dir beschrieben- zunächst das Java-Programm über Eclipse gestartet, dann eine Exceltabelle (Office 2010) geöffnet, dort Zellen markiert und kopiert, dann in dem Programm das Return abgesetzt (also den "Lade-Button gedrückt") und alles hat geflutscht. Auch so konnte ich das von Dir beobachtete Verhalten leider nicht reproduzieren. Ich würde daher Eclipse, Excel und den spezifischen Java-Code zum Zugriff auf die Zwischenablage als Ursache für die Langsamkeit ausschließen. Greifst Du in Deiner Swing-Gui noch irgendwo anders auf die Zwischenablage zu? Vielleicht kommen diese Zugriffe sich ins Gehege.
 

Zurück
Oben