关于JTextPane中进行搜索结果显示的问题及解决

在JTextPane中进行搜索结果显示时,第一次使用如下方法来进行显示:

 

			int start = textPane.getText().indexOf(str, position);
			
			if (-1 != start){
                                position = start + str.length();
				textPane.setSelectionStart(start);
				textPane.setSelectionEnd(start + str.length());
                        }

 

 结果发现除第一行的搜索结果位置正确外,其它行的位置均不正确。

 原因貌似是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, "搜索完毕。");
			}
 

 

 

你可能感兴趣的:(text)