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);
Другие вопросы по тегам