2016-07-20 9 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 

お知らせなってしまうであると仮定します分割された文字列に "print again"を追加すると、空の文字列が取得されます。

サブ文字列を使用して問題を解決し、標準のJava文字列分割メソッドを使用して同じ問題が発生しました。

最後に、これを修正するために、私はJavaFXクリップボードの代わりにjava.awtクリップボードを使用しました。突然...それは機能しました!代わりに、JavaFXのクリップボードのpasteStringを取得するために上記のコード行を使用して

 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) { 

     } 

は、問題を修正し、今私が期待される動作し、出力を得ます。

今のところ私は上記の修正に固執しますが、awtクリップボードにないときにJavaFXクリップボードがこの動作を生成しているのは奇妙です。誰がなぜこれが起こっているのか説明できますか?これはJavaFXクリップボードのバグですか?

+0

'System.getProperty(" line.separator ")'を ''私のために修正しました。 –

+0

ありがとうございます。これは機能しているようです。 – Aceplace

答えて

0

上記のLuxxMinerのコメントは、解決策を提示するようです。

System.lineSeparator()を使用するとうまくいくようです。

0

残念ながら、上記の解決策は私にとってはうまくいきませんでした。問題は、システムのセパレータが私のシステム用のセパレータを取得している間に、別のプログラムからコピー&ペーストすると、コピー元のプログラムがシステムのセパレータを使用していることが保証されないということです。たとえば、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);