Search in JTextarea.

B

Bumsys

I have dialog with jtextarea and i want to find some data in it. I
need search function. I enter some data into field search and show
place in text where this data is. Do anyone know where such code is in
internet?
 
J

Jeff Higgins

Bumsys said:
I have dialog with jtextarea and i want to find some data in it. I
need search function. I enter some data into field search and show
place in text where this data is. Do anyone know where such code is in
internet?

You've not provided enough specific imformation.
What Document model are you using?
What data are you searching for?

To start you could look at the Java API documentation for:
javax.swing.text.Document, and
javax.swing.text.Element
 
J

Jeff Higgins

Bumsys said:
I have dialog with jtextarea and i want to find some data in it. I
need search function. I enter some data into field search and show
place in text where this data is. Do anyone know where such code is in
internet?


import java.util.List;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.concurrent.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextSearchTest {

private static class Search
implements Callable<List<Integer>> {

private Document document;
List<Integer> dataOffsets;
String searchString;

public Search(Document document, String searchString) {
this.document = document;
this.searchString = searchString;
}

@Override
public List<Integer> call() throws Exception {
search();
return dataOffsets;
}

@SuppressWarnings("boxing")
private void search() {

List<Integer> lineOffsets =
new ArrayList<Integer>();
dataOffsets =
new ArrayList<Integer>();
Element element =
document.getDefaultRootElement();
int elementCount =
element.getElementCount();

for (int i = 0; i < elementCount; i++) {
lineOffsets
.add(element.getElement(i).getStartOffset());
}
lineOffsets
.add(element.getElement(element.getElementCount() - 1)
.getEndOffset());

int count = 0;
int lsOffset;
int leOffset;

while (count < (lineOffsets.size() - 1)) {

lsOffset = lineOffsets.get(count);
leOffset = lineOffsets.get(count + 1);
count++;
Segment seg = new Segment();

try {
document.getText(lsOffset, leOffset - lsOffset, seg);
}
catch (BadLocationException e) {
e.printStackTrace();
}

String line = seg.toString();
int mark = 0;

while ((mark = line.indexOf(searchString, mark)) > -1) {
dataOffsets.add(lsOffset + mark);
mark += searchString.length();
}
}
}

public String getSearchString() {
return searchString;
}

}

private static class TextSearchPanel
extends JPanel implements ActionListener {

private static final long serialVersionUID = 1L;

private String text =
"This little line had some data,\n" +
"And this little line had none.\n" +
"Chorus:\n" +
"data data data data";

JTextField textField;
JTextArea textArea;

public TextSearchPanel() {
super(new GridBagLayout());

textField = new JTextField(20);
textArea = new JTextArea(5, 20);

textField.addActionListener(this);
textField.setText("data");
textArea.setEditable(true);
textArea.setText(text);
JScrollPane scrollPane =
new JScrollPane(textArea);

GridBagConstraints c =
new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;

c.fill = GridBagConstraints.HORIZONTAL;
add(textField, c);

c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
add(scrollPane, c);
}

@SuppressWarnings("boxing")
@Override
public void actionPerformed(ActionEvent event) {

Cursor startCursor =
textArea.getCursor();
Cursor waitCursor =
new Cursor(Cursor.WAIT_CURSOR);
Highlighter highlighter =
textArea.getHighlighter();
String searchText =
textField.getText();
Search search =
new Search(textArea.getDocument(), searchText);

textArea.setEditable(false);
textArea.setCursor(waitCursor);
highlighter.removeAllHighlights();

ExecutorService service =
Executors.newSingleThreadExecutor();
Future<List<Integer>> offsets = service.submit(search);

try {
for (Integer start : offsets.get()) {
highlighter.addHighlight(start,
start + searchText.length(),
DefaultHighlighter.DefaultPainter);
}
}
catch (Exception e) {}

textArea.setEditable(true);
textArea.setCursor(startCursor);
}
}

private static void createAndShowGUI() {

JFrame frame = new JFrame("TextSearchTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TextSearchPanel());
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,432
Messages
2,571,680
Members
48,796
Latest member
Greg L.

Latest Threads

Top