自学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;
}