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