JTextPaneで検索結果表示を行う問題と解決について

1873 ワード

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, "    。");
			}