JavaFX拆分剪贴板getString()奇怪的行为

时间:2016-07-20 19:11:12

标签: java string javafx clipboard splitter

我使用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");
            }
         }
    }
}

我使用输出语句来演示问题。 基本上,我将基于字符串的内容拆分为&#39; \ n&#39;和&#39; \ t&#39;字符。 问题是每当我尝试用拆分字符串做任何事情时,字符串就是...... 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

注意我何时尝试追加&#34;再次打印&#34;对于分裂字符串,我只是得到空字符串。

我尝试使用子字符串修复问题,并使用标准的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剪贴板修复了问题,现在我得到了预期的行为和输出。

现在,我将坚持使用上述修复,但是当awt剪贴板没有时,JavaFX剪贴板产生这种行为似乎很奇怪。任何人都可以解释为什么会这样吗?这是JavaFX剪贴板的错误吗?

2 个答案:

答案 0 :(得分:0)

LuxxMiner上面的评论似乎提供了解决方案。

使用System.lineSeparator()似乎也可以正常工作。

答案 1 :(得分:0)

不幸的是,我发现上述解决方案对我来说并不合适。问题是,虽然系统分离器确实让我成为我的系统的分离器,但当我从另一个程序复制并粘贴时,我不能保证我复制的程序正在使用系统&#39;分隔符。例如,当我从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);