JavaFX расщепление буфера обмена getString() странное поведение
Я сделал программу с использованием JavaFX, где я должен вставить в таблицу, как Excel.
Я следовал за некоторыми учебниками онлайн, но заметил странное поведение в том, как код вставки функционирует. Через некоторое время я выделил проблему для следующего кода.
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. Проблема заключается в том, что всякий раз, когда я пытаюсь что-либо сделать с разделенными строками, строка просто... исчезает... операторы вывода, которые я вставил, демонстрируют это.
Предположим, что строка в буфере обмена
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?
2 ответа
Вышеприведенный комментарий LuxxMiner предлагает решение.
С помощью System.lineSeparator()
тоже вроде нормально работает.
К сожалению, я обнаружил, что вышеупомянутые решения не совсем сработали для меня. Проблема в том, что хотя системный разделитель действительно дает мне разделитель для моих систем, когда я копирую и вставляю из другой программы, не гарантируется, что программа, из которой я копирую, использует системный разделитель. Например, когда я копировал из таблицы 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);