`
icarusliu
  • 浏览: 231722 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于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, "搜索完毕。");
			}
 

 

 

  • src.rar (19.1 KB)
  • 下载次数: 7
分享到:
评论
2 楼 icarusliu 2012-08-19  
java1997 写道
博主,你好,正好用到这个,能不能贴个完整的使用代码啊,谢谢

完整的程序已经在附件中上传了。搜索的代码在ContentTextPane这个类的nextSearchPos这个函数里面。代码里面在每个段落中只命中一个结果,还需要修改一下。
1 楼 java1997 2012-08-19  
博主,你好,正好用到这个,能不能贴个完整的使用代码啊,谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics