JTextPaneで検索結果表示を行う問題と解決について
1873 ワード
JTextPaneで検索結果表示を行う場合、初めて次の方法で表示されます.
その結果,1行目の検索結果の位置が正しい以外は,他の行の位置が正しくないことが分かった.
理由はindexOfが改行を計算したようですが、setSelectionStartは改行を計算していないため、実際の結果よりも結果の位置が後ろになります.
JTextPaneに表示されているテキストの各セグメントを検索し、ヒットしたテキストを選択モードに設定するには、次の方法しかありません.
int start = textPane.getText().indexOf(str, position);
if (-1 != start){
position = start + str.length();
textPane.setSelectionStart(start);
textPane.setSelectionEnd(start + str.length());
}
その結果,1行目の検索結果の位置が正しい以外は,他の行の位置が正しくないことが分かった.
理由はindexOfが改行を計算したようですが、setSelectionStartは改行を計算していないため、実際の結果よりも結果の位置が後ろになります.
JTextPaneに表示されているテキストの各セグメントを検索し、ヒットしたテキストを選択モードに設定するには、次の方法しかありません.
Document doc = textPane.getDocument();
Element root = doc.getDefaultRootElement();
//
if (nowSeg < root.getElementCount()){
Element seg = root.getElement(nowSeg);
try {
String line = doc.getText(seg.getStartOffset(), seg.getEndOffset() - seg.getStartOffset());
int start = line.indexOf(str);
while (-1 == start){
nowSeg++;
if (nowSeg >= root.getElementCount()){
//
JOptionPane.showMessageDialog(null, " 。");
return;
}
seg = root.getElement(nowSeg);
line = doc.getText(seg.getStartOffset(), seg.getEndOffset() - seg.getStartOffset());
start = line.indexOf(str);
}
textPane.setSelectionStart(seg.getStartOffset() + start);
textPane.setSelectionEnd(seg.getStartOffset() + start + str.length());
nowSeg++;
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(null, " 。");
}