JTextArea 实现如UltraEdit 查找功能

时间:2021-04-11 19:13:35
使用到的组件:JTextAare,Jscrollpane

目前我做到在JTextArea查找某个字符然后滚动条会滚动到指定的行数,并且会高亮显示,
代码如下: setCaretPosition(text.getText().indexOf("aaaa"))

但效果不如 UltraEdit 查找功能强大,UltraEdit 查找功能会将查找出来的数据显示在 滚动条中间位置,不知道如何将查找出来的数据显示在滚动条中间,望高手帮帮忙,给段代码会提示啊!!!

7 个解决方案

#1


兄弟们帮帮忙啊

#2


滚动条中间位置 是什么意思啊?
这一行处于屏幕正中?

#3


引用 2 楼 lura_xx 的回复:
滚动条中间位置 是什么意思啊?
这一行处于屏幕正中?


对,就是显示在JTextArea显示区域中间

#4



public class Study14 extends JFrame
{
static JTextArea ja=new JTextArea(); 
static javax.swing.JScrollPane jScrollPane = new JScrollPane(ja);  
public Study14()
{
 
jScrollPane.setBounds(0,160,500,300);  
add(jScrollPane);
try {
ReadFile.readFile("D:\\test\\V300R003C01B002_2010_09_13_TOR_BF_011_001_013(100914.051951)\\100914.051951\\TOR_BF_011_001_013_GTR_BIN.log", ja);
   
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException, InterruptedException, BadLocationException
{
JFrame f = new Study14();
f.setVisible(true);
f.setBounds(400, 300, 800, 500);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.addWindowListener(new WindowAdapter() 
{
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});


System.out.println(jScrollPane.getVerticalScrollBar().getMaximum());

//Thread.sleep(2000);
System.out.println(ja.getLineCount());
int index = ja.getText().indexOf("2010-09-14 05:20:59");
ja.setCaretPosition(index);
}
}


class ReadFile
{
public static void readFile(String fileName,JTextArea area) throws IOException
{
FileReader reader = null;
BufferedReader bf = null;
try 
{
 reader = new FileReader(new File(fileName));
 bf = new BufferedReader(reader);
 String line = null;
 while((line=bf.readLine())!=null)
 {
 area.append(line+"\n");
 }

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally
{
reader.close();
bf.close();
}

}
}


这是段demo代码,大家试试就更明白了

#5


ReadFile没必要自己编写。

DefaultEditorKit 提供了 read 方法。

#6


引用 5 楼 huntor 的回复:
ReadFile没必要自己编写。

DefaultEditorKit 提供了 read 方法。


呵呵,谢谢提醒
这个问题该怎么解决啊,我接触swing才几天,搞不定啊

#7


已经搞定
分享一下:
int line = area.getLineOfOffset(area.getText().indexOf("aaa"));
int h = line * (area.getHeight() / area.getLineCount()) - (scrollPane.getHeight()/2);
scrollPane.getVerticalScrollBar().setValue(h);

#1


兄弟们帮帮忙啊

#2


滚动条中间位置 是什么意思啊?
这一行处于屏幕正中?

#3


引用 2 楼 lura_xx 的回复:
滚动条中间位置 是什么意思啊?
这一行处于屏幕正中?


对,就是显示在JTextArea显示区域中间

#4



public class Study14 extends JFrame
{
static JTextArea ja=new JTextArea(); 
static javax.swing.JScrollPane jScrollPane = new JScrollPane(ja);  
public Study14()
{
 
jScrollPane.setBounds(0,160,500,300);  
add(jScrollPane);
try {
ReadFile.readFile("D:\\test\\V300R003C01B002_2010_09_13_TOR_BF_011_001_013(100914.051951)\\100914.051951\\TOR_BF_011_001_013_GTR_BIN.log", ja);
   
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException, InterruptedException, BadLocationException
{
JFrame f = new Study14();
f.setVisible(true);
f.setBounds(400, 300, 800, 500);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.addWindowListener(new WindowAdapter() 
{
@Override
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});


System.out.println(jScrollPane.getVerticalScrollBar().getMaximum());

//Thread.sleep(2000);
System.out.println(ja.getLineCount());
int index = ja.getText().indexOf("2010-09-14 05:20:59");
ja.setCaretPosition(index);
}
}


class ReadFile
{
public static void readFile(String fileName,JTextArea area) throws IOException
{
FileReader reader = null;
BufferedReader bf = null;
try 
{
 reader = new FileReader(new File(fileName));
 bf = new BufferedReader(reader);
 String line = null;
 while((line=bf.readLine())!=null)
 {
 area.append(line+"\n");
 }

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally
{
reader.close();
bf.close();
}

}
}


这是段demo代码,大家试试就更明白了

#5


ReadFile没必要自己编写。

DefaultEditorKit 提供了 read 方法。

#6


引用 5 楼 huntor 的回复:
ReadFile没必要自己编写。

DefaultEditorKit 提供了 read 方法。


呵呵,谢谢提醒
这个问题该怎么解决啊,我接触swing才几天,搞不定啊

#7


已经搞定
分享一下:
int line = area.getLineOfOffset(area.getText().indexOf("aaa"));
int h = line * (area.getHeight() / area.getLineCount()) - (scrollPane.getHeight()/2);
scrollPane.getVerticalScrollBar().setValue(h);