Java 如何仅在JtextPane中查找整个单词
我必须在给定的文本中找出整个单词。我已经试过了。但是,有时它不起作用。例如,整个单词包含给定文本的开头作为子字符串,给定文本的结尾包含整个单词,我连续按搜索按钮,在某些情况下显示错误偏移量超出范围。请帮助我。提前谢谢 这是我的密码:Java 如何仅在JtextPane中查找整个单词,java,string,swing,awt,Java,String,Swing,Awt,我必须在给定的文本中找出整个单词。我已经试过了。但是,有时它不起作用。例如,整个单词包含给定文本的开头作为子字符串,给定文本的结尾包含整个单词,我连续按搜索按钮,在某些情况下显示错误偏移量超出范围。请帮助我。提前谢谢 这是我的密码: public class FindWholeWord extends javax.swing.JFrame { public static void main(String args[]) { /* Set the Nimbus l
public class FindWholeWord extends javax.swing.JFrame {
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new FindWholeWord().setVisible(true);
}
});
}
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTextField searchText;
private javax.swing.JTextPane textPane;
private javax.swing.JButton search;
public FindWholeWord() {
initComponents();
}
public void highLight(JTextComponent component, String patteren) {
try {
Document doc = component.getDocument();
String text = component.getText(0, doc.getLength());
int pos = component.getCaretPosition();
if (pos == doc.getLength()) {
pos = 0;
}
int index = text.toUpperCase().indexOf(patteren.toUpperCase(), pos);
int start = Utilities.getWordStart(component, index);
int end = Utilities.getWordEnd(component, index + patteren.length());
int patterenLn=patteren.length();
int diff=end-start;
if (index >= 0) {
if((start==index)&&(end==index+patterenLn+1)){
component.setSelectionStart(index);
component.setSelectionEnd(index + patteren.length());
component.getCaret().setSelectionVisible(true);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
search = new javax.swing.JButton();
searchText = new javax.swing.JTextField();
scrollPane = new javax.swing.JScrollPane();
textPane = new javax.swing.JTextPane();
searchText.setText("test");
textPane.setText("test qweqw test asdasdas test");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
search.setText("Search");
search.setFocusable(false);
search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchActionPerformed(evt);
}
});
scrollPane.setViewportView(textPane);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addComponent(search, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(32, 32, 32)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(114, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(scrollPane)
.addContainerGap()));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(search)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)));
pack();
}// </editor-fold>
private void searchActionPerformed(java.awt.event.ActionEvent evt) {
highLight(textPane, searchText.getText());
}
}
搜索时索引很少有问题,首先,在尝试使用该值之前,不检查indexOf的结果是否为-1;如果匹配的单词位于文档末尾,则不会返回匹配项,等等 我没有尝试修补它,而是重新编写了它
public void highLight(JTextComponent component, String patteren) {
try {
Document doc = component.getDocument();
String text = component.getText(0, doc.getLength());
int pos = component.getCaretPosition();
boolean found = false;
int findLength = patteren.length();
// Rest the search position if we're at the end of the document
if (pos + findLength > doc.getLength()) {
pos = 0;
}
while (pos + findLength <= doc.getLength()) {
// Extract the text from teh docuemnt
String match = doc.getText(pos, findLength).toLowerCase();
// Check to see if it matches or request
if (match.equals(patteren)) {
found = true;
break;
}
pos++;
}
if (found) {
component.setSelectionStart(pos);
component.setSelectionEnd(pos + patteren.length());
component.getCaret().setSelectionVisible(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
更新了更积极的空白检查
运行此代码-已处理-1索引值
public class Trial extends javax.swing.JFrame {
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Trial().setVisible(true);
}
});
}
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTextField searchText;
private javax.swing.JTextPane textPane;
private javax.swing.JButton search;
public Trial() {
initComponents();
}
public void highLight(JTextComponent component, String patteren) {
try {
Document doc = component.getDocument();
String text = component.getText(0, doc.getLength());
int pos = component.getCaretPosition();
if (pos == doc.getLength()) {
pos = 0;
}
int index = text.toUpperCase().indexOf(patteren.toUpperCase(), pos);
int start = 0;
int end = 0;
if(index>=0){
start=Utilities.getWordStart(component, index);
end=Utilities.getWordEnd(component, index + patteren.length());
int patterenLn=patteren.length();
int diff=end-start;
if (index >= 0) {
if((start==index)&&(end==index+patterenLn+1)){
component.setSelectionStart(index);
component.setSelectionEnd(index + patteren.length());
component.getCaret().setSelectionVisible(true);
}
}
}else{
JOptionPane.showMessageDialog(component, "Word Not FOund");
}
}catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
search = new javax.swing.JButton();
searchText = new javax.swing.JTextField();
scrollPane = new javax.swing.JScrollPane();
textPane = new javax.swing.JTextPane();
searchText.setText("test");
textPane.setText("test qweqw test asdasdas test");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
search.setText("Search");
search.setFocusable(false);
search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchActionPerformed(evt);
}
});
scrollPane.setViewportView(textPane);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addComponent(search, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(32, 32, 32)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(114, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(scrollPane)
.addContainerGap()));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(search)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)));
pack();
}// </editor-fold>
private void searchActionPerformed(java.awt.event.ActionEvent evt) {
highLight(textPane, searchText.getText());
}
}
为什么不使用正则表达式呢
Matcher matcher = Pattern.compile("(?i)" + pattern + "\\b").matcher(text);
while (matcher.find(pos)) {
component.setSelectionStart(matcher.start());
component.setSelectionEnd(matcher.end());
component.getCaret().setSelectionVisible(true);
break;
}
我只想搜索整个单词。例如,给定的文本是testcase某物测试任何东西测试。只突出显示测试两次。我不想突出显示testcase中的测试。你拿着这篇文本并检查我的程序,这样你就可以轻松理解我的问题。谢谢你的回答。好的,查看如何修改匹配的if语句以满足该要求。我已使用以下测试用例dsfbr test hfgbr test hdgfrhd test CASE fgd test rejhge herbgur test尝试了此程序。它不会突出显示all测试。请检查一次。谢谢。假设您只需要整个单词匹配,则它可以找到。它与您提供的字符串中的每个测试匹配尝试以下测试用例dsfbr test hfgbrhere\n test hdgfrhd testcasehere\n fgd test rejhge herbgur test.Cpment显示单行。这是我的换行符。给定的文本分为三行。请尝试并回复我。谢谢。@Jens javax.swing.text.Utilities;从代码开始如何从Oracle官方教程中搜索JTextComponents注意:上个月在这里询问并回答了有关性能的问题请保持代码片段简短,并解释实际问题、您尝试过的内容以及出现的错误。这很好。但这并不是检查单词空间的结尾。
public class Trial extends javax.swing.JFrame {
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Trial().setVisible(true);
}
});
}
private javax.swing.JScrollPane scrollPane;
private javax.swing.JTextField searchText;
private javax.swing.JTextPane textPane;
private javax.swing.JButton search;
public Trial() {
initComponents();
}
public void highLight(JTextComponent component, String patteren) {
try {
Document doc = component.getDocument();
String text = component.getText(0, doc.getLength());
int pos = component.getCaretPosition();
if (pos == doc.getLength()) {
pos = 0;
}
int index = text.toUpperCase().indexOf(patteren.toUpperCase(), pos);
int start = 0;
int end = 0;
if(index>=0){
start=Utilities.getWordStart(component, index);
end=Utilities.getWordEnd(component, index + patteren.length());
int patterenLn=patteren.length();
int diff=end-start;
if (index >= 0) {
if((start==index)&&(end==index+patterenLn+1)){
component.setSelectionStart(index);
component.setSelectionEnd(index + patteren.length());
component.getCaret().setSelectionVisible(true);
}
}
}else{
JOptionPane.showMessageDialog(component, "Word Not FOund");
}
}catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
search = new javax.swing.JButton();
searchText = new javax.swing.JTextField();
scrollPane = new javax.swing.JScrollPane();
textPane = new javax.swing.JTextPane();
searchText.setText("test");
textPane.setText("test qweqw test asdasdas test");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
search.setText("Search");
search.setFocusable(false);
search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchActionPerformed(evt);
}
});
scrollPane.setViewportView(textPane);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addComponent(search, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(32, 32, 32)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(114, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(scrollPane)
.addContainerGap()));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(search)
.addComponent(searchText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)));
pack();
}// </editor-fold>
private void searchActionPerformed(java.awt.event.ActionEvent evt) {
highLight(textPane, searchText.getText());
}
}
Matcher matcher = Pattern.compile("(?i)" + pattern + "\\b").matcher(text);
while (matcher.find(pos)) {
component.setSelectionStart(matcher.start());
component.setSelectionEnd(matcher.end());
component.getCaret().setSelectionVisible(true);
break;
}