62,628
社区成员
发帖
与我相关
我的任务
分享import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.Highlighter.HighlightPainter;
// 高亮:
// 1. text area 先设置setHighlighter为hilit
// 2. 添加要高亮字符的下标到hilit里
@SuppressWarnings("serial")
public final class Finder extends JFrame implements DocumentListener, CaretListener {
private JLabel status;
private JTextField entry;
private JTextArea textArea;
private JScrollPane scroller;
private Highlighter hilit;
private HighlightPainter painter;
private final Color NO_FOUND_COLOR = Color.PINK;
private final Color HILIT_COLOR = Color.YELLOW;
public Finder() {
initComponents();
entry.getDocument().addDocumentListener(this);
try {
FileReader reader = new FileReader("Finder.java");
textArea.read(reader, null);
} catch (IOException e) {
e.printStackTrace();
}
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
textArea.setTabSize(4);
textArea.addCaretListener(this);
hilit = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
textArea.setHighlighter(hilit);
}
private void initComponents() {
status = new JLabel("");
entry = new JTextField();
textArea = new JTextArea();
scroller = new JScrollPane(textArea);
JLabel label1 = new JLabel("Enter text to search:");
// Layouts components using group layout
GroupLayout layout = new GroupLayout(getContentPane());
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
getContentPane().setLayout(layout);
// Horizontal axis
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
GroupLayout.SequentialGroup topSGroup = layout.createSequentialGroup();
topSGroup.addComponent(label1).addComponent(entry);
hGroup.addGroup(layout.createParallelGroup().addGroup(topSGroup).addComponent(scroller)
.addComponent(status));
layout.setHorizontalGroup(hGroup);
// Vertical axis
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
GroupLayout.ParallelGroup topPGroup = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
topPGroup.addComponent(label1).addComponent(entry);
vGroup.addGroup(topPGroup).addComponent(scroller).addComponent(status);
layout.setVerticalGroup(vGroup);
// Setting frame
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int width = 600;
int height = 700;
int x, y;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
x = (screenSize.width - width) / 2;
y = (screenSize.height - height) / 2 - 600;
x = x > 0 ? x : 0;
y = y > 0 ? y : 0;
setLocation(x, y);
setSize(width, height);
}
public void search(String s) {
if (s == null) {
return;
}
hilit.removeAllHighlights();
if (s.length() <= 0) {
status.setText("No text to search.");
return;
}
// 高亮:
// 1. text area 先设置setHighlighter为hilit
// 2. 添加要高亮字符的下标到hilit里
String content = textArea.getText();
int start = content.indexOf(s);
if (start >= 0) {
entry.setBackground(Color.WHITE);
while (start >= 0) {
int end = start + s.length();
try {
hilit.addHighlight(start, end, painter);
} catch (BadLocationException e) {
e.printStackTrace();
}
start = content.indexOf(s, end);
}
status.setText(s + " found.");
} else {
status.setText(s + " not found.");
entry.setBackground(NO_FOUND_COLOR);
}
}
public void changedUpdate(DocumentEvent e) {
}
public void insertUpdate(DocumentEvent e) {
search(entry.getText());
}
public void removeUpdate(DocumentEvent e) {
search(entry.getText());
}
public void caretUpdate(CaretEvent e) {
search(textArea.getSelectedText());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Finder().setVisible(true);
}
});
}
}