2016-07-20 8 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 클립 보드를 사용했는데 갑자기 ... 작동했습니다! 대신 자바 FX 클립 보드의 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")'대신' "를 사용하십시오. \ n"'나를 고쳐주었습니다. –

+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);