java中JTextArea控件,鼠标点击哪一行,就获取哪一行的内容

自学java的过程中,写一个小demo,其中需要在JTextArea控件,鼠标点击哪一行,就获取哪一行的内容。

监听鼠标的点击事件这些就不说了。

其实有两种方式,一种比较简单,但是有点约束(该方法代码,摘自自互联网),一开始为了通用,想把row的值传递出来给其他方法使用,但是怎么都实现不了。不过应该可以写到JTable之类的控件中,再读取JTable中值。这样应该可以达到目的。按下暂且不表。

displayContent.addCaretListener(new CaretListener() {  
				
              public void caretUpdate(CaretEvent e) {  
                  try {  
                      int offset = e.getDot() ;  //获得插入符的位置。   
                     
                      //getLineOfOffset(int offset)  将组件文本中的偏移量转换为行号  
                      int row = displayContent.getLineOfOffset(offset);  
                        
                      //getLineStartOffset(int line)   取得给定行起始处的偏移量。  
                      //getLineEndOffset(int line)     取得给定行结尾处的偏移量。  
                      int column = e.getDot() - displayContent.getLineStartOffset(row);  
                       
                      // 在状态栏中显示当前光标所在行号、所在列号  
                      System.out.println("Line: " + (row + 1) + ", Column: " + (column+1)); 
                      row = displayContent.getLineStartOffset(row+1);
         
                      
                  } catch (Exception ex) {  
                      ex.printStackTrace();  
                  }  
              }  
			}); 

 

另外一种比较笨重,可能性能也不高,但是比较通用。现在就铺上第二种笨重的方法的代码。有需要用的可以借鉴一下。

说明:

1.下面程序中textContent为JTextArea中的内容,可以通过getText();方法获取。

2.由于JtextArea中的内容,我添加进去的时候,在每行加了\r\n进行换行。

3.根据JTextArea中的getCaretPosition()方法,获取当前光标的所在位置,进而判断对应的行,获取对应行的数据。

//获取JTextArea指定行内容
		public  String getRowText(String textContent){
			LinkedHashMap<Integer,Map<Integer,String>> hash = (LinkedHashMap<Integer,Map<Integer,String>>)saveTextInfo(textContent);
			LinkedHashMap<Integer,String> json = (LinkedHashMap<Integer,String>)hash.get(0);
			if(json.size()!=0){
				for(int i:json.keySet()){
		        	 if(i >= displayContent.getCaretPosition()&& displayContent.getCaretPosition()>=(i-json.get(i).length()-1)){
		        		 return json.get(i);
		        	 }else{
		        		 System.out.println("出问题了");
		        	 }
		         }
			}else{
				System.out.println("文本区没有内容");
			}
			return "";
		}

 

//获取文本框中的内容,并加以处理,方便调用的方法的使用
public static Map<Integer,Map<Integer,String>> saveTextInfo(String textContent){
		
		//把每个行的标记分别存入map
		Map<Integer,Map<Integer,String>> enterMark = new LinkedHashMap<>();//存标志点所在文本的位置,以及该标志前面的内容(子匹配)
		Map<Integer,String> contenMark = new LinkedHashMap<>();  //存标志点所在的行
		int rowCount = 0;
		int enterCount = 0;
        String regex = "\r\n";
        Pattern p =Pattern.compile(regex);
        Matcher m = p.matcher(textContent);
        String[] contenArray = p.split(textContent);
        while(m.find()){
        	enterCount = m.end();//换行符所在的位置
        	contenMark.put(enterCount-1, contenArray[rowCount]);//存取换行符的位置以及对应的内容,方便后续根据光标的所在位置,判断对应的所在行以及获取对应的内容
        	enterMark.put(rowCount, contenMark);//把上面的信息打包,作为一个向量
        	rowCount++;
        }
        return enterMark;
     }

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值