2016-07-20 6 views
0

Я создал программу с использованием JavaFX, где мне нужно вставить в таблицу Excel.Разделение JavaFX Буфер обмена getString() странное поведение

Я следил за некоторыми учебниками онлайн, но заметил странное поведение в том, как работает код вставки. Через некоторое время я выделил проблему на следующий код.

public void handlePaste() { 
    Clipboard clipboard = Clipboard.getSystemClipboard(); 

    if (clipboard.hasString()) { 
     //start from the point that has focus 
     // abort if there's not cell selected to start with 
     if (getSelectionModel().getSelectedCells().size() == 0) { 
      return; 
     } 

     // get the cell position to start with 
     TablePosition pasteCellPosition = getFocusModel().getFocusedCell(); 

     String pasteString = Clipboard.getSystemClipboard().getString(); 

     int rowClipboard = -1; 

     Iterable<String> rowStrings = Splitter.on("\n").omitEmptyStrings().split(pasteString); 
     System.out.println("Print Rows"); 
     for (String rowString : rowStrings) { 
      System.out.println(rowString); 
      System.out.println(rowString + " printing again"); 
     } 

     for (String rowString : rowStrings) { 
      rowClipboard++; 
      Iterable<String> columnStrings = Splitter.on("\t").split(rowString); 

      int colClipboard = -1; 
      System.out.println("Printing Columns"); 
      for (String columnString : columnStrings) { 
       System.out.println(columnString); 
       System.out.println(columnString + " printing again"); 
      } 
     } 
    } 
} 

Я использую выходной оператор, чтобы продемонстрировать проблему. В принципе, я разделяю содержимое строки на основе и символы «\ n» и «\ t». Проблема заключается в том, что когда я пытаюсь что-либо сделать с помощью разделенных строк, строка просто ... DISAPPEARS ... Выводные инструкции, которые я вставляю, демонстрируют это.

Предположим, что строка в буфере обмена

l a 
l b 
l c 

Тогда ожидаемый результат должен быть

Print rows 
l a 
l a printing again 
l b 
l b printing again 
r c 
r c printing again 
Printing Columns 
l 
l again 
a 
a again 
l 
l again 
b 
b again 
r 
r again 
c 
c again 

Но выход заканчивает тем, что

Print rows 
l a 
printing again 
l b 
printing again 
r c 
printing again 
Printing Columns 
l 
again 
a 
again 
l 
again 
b 
again 
r 
again 
c 
again 

Обратите внимание, как, когда я пытаюсь добавьте «печать снова» в строку разделения, я просто получаю пустые строки.

Я попытался исправить проблему с помощью подстроки и с помощью стандартных методов расщепления строк Java, и я получил то же поведение.

Наконец, чтобы исправить это, я просто использовал буфер обмена java.awt вместо буфера обмена JavaFX и вдруг ... он сработал!

 java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit(); 
     java.awt.datatransfer.Clipboard awtClipboard = toolkit.getSystemClipboard(); 
     try { 
      pasteString = (String) awtClipboard.getData(java.awt.datatransfer.DataFlavor.stringFlavor); 
     } catch (UnsupportedFlavorException ex) { 

     } catch (IOException ex) { 

     } 

Используя приведенные выше строки кода, чтобы получить pasteString вместо буфера обмена JavaFX исправили проблему, и теперь я получаю ожидаемое поведение и выход.

На данный момент я придерживаюсь вышеуказанного исправления, но кажется странным, что буфер обмена JavaFX создает такое поведение, когда буфер обмена awt этого не делает. Может ли кто-нибудь объяснить, почему это происходит? Это ошибка с буфером обмена JavaFX?

+0

Использование 'System.getProperty (« line.separator »)' вместо '' \ n "' исправлено для меня. –

+0

Спасибо. Кажется, это работает. – Aceplace

ответ

0

Замечание LuxxMiner выше, как представляется, предлагает решение.

Использование System.lineSeparator() также похоже на работу.

0

К сожалению, я нашел, что вышеупомянутые решения не совсем сработали для меня. Проблема в том, что в то время как системный seperator делает меня seperator для моих систем, когда я копирую и вставляю из другой программы, не гарантируется, что программа, которую я копирую, использует seperator системы. Например, когда я копировал из таблицы Excel, я продолжал получать то же самое странное поведение, что и раньше, и я считаю, что это произошло потому, что Excel не использовал системный разделитель.

Итак, это решение, с которым я в конце концов натолкнулся ... В основном он ищет ЛЮБОЙ из основных разделителей линии и разбивается на них.

import com.google.common.base.CharMatcher; 
import com.google.common.base.Splitter; 
Iterable<String> rowStrings = Splitter.on(CharMatcher.anyOf("\n\r")).omitEmptyStrings().split(pasteString); 
Смежные вопросы