私は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クリップボードのバグですか?
'System.getProperty(" line.separator ")'を ''私のために修正しました。 –
ありがとうございます。これは機能しているようです。 – Aceplace