在 JTextArea 上突出显示文本

Highlight Text on JTextArea

我需要在 JTextArea 上突出显示文本,我使用 JTextField 获取用户输入,然后使用 Button 获取 JTextFields 文本。最终我需要让它突出显示 JTextArea exp 中字符串的所有出现:我有 200 个单词和 10 个单词 'dog' 我希望狗被突出显示 10 次。

我似乎对循环本身有问题,它突出显示了第一次出现,然后是 none。

    private void getSearch() throws BadLocationException {

                 // my textfield (searchT)
               String jtf = searchT.getText();

                // my jtextarea  (userField);
                String jta = userField.getText();

                hilit = userField.getHighlighter();
                hilit.removeAllHighlights();


         int index = jta.indexOf(jtf);

        while(index >=0){
        System.out.println("looping");

       int len = jtf.length();
        hilit.addHighlight(index,index+len, painter);
        index = jta.indexOf(jta, index+len);


    }

     }   




**PER REQUEST:**


public class project extend Frame implements ActionListener{

   Highlighter hilit;
   Highlighter.HighlightPainter painter;



public project(){


     userField = new JTextArea();
     searchT = new JTextField("Spotlight");
     searchT.setEditable(true);
     searchT.setBorder(new LineBorder (Color.black));

     searchB = new JButton("Search");

        hilit = new DefaultHighlighter();
        painter = new                    DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);





// JButton (searchB) with ActionListener 
 searchB.addActionListener(new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        try {
            searchBActionPerformed(evt);
        } catch (BadLocationException ex) {
            Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

           private void searchBActionPerformed(ActionEvent evt) throws BadLocationException  {
               Object sb = evt.getSource();
             if(searchB==sb){
           getSearch();

               }

           }
           private void getSearch() throws BadLocationException {

             // my jtextfield
           String jtf = searchT.getText();
            // my jtextarea
            String jta = userField.getText();

            hilit = userField.getHighlighter();
            hilit.removeAllHighlights();


     int index = jta.indexOf(jtf);

    while(index >=0){
    System.out.println("looping");


    System.out.println("im searching for"+index);
    int len = jtf.length();
    hilit.addHighlight(index,index+len, painter);
    index = jta.indexOf(jta, index+len);
    System.out.println("this is what I want to highlight"+ index);
    // remove hightlights with a timer for example after 10 seconds
}

 }   

是的,搜索正确的字符串:

while(index >=0){
  System.out.println("looping");
  int len = jtf.length();
  hilit.addHighlight(index,index+len, painter);
  index = jta.indexOf(jtf, index+len);
}

--

我根据你的代码编写了一个小程序:唯一的问题是正如我所说你正在寻找错误的字符串(你没有在 indexOf() 中将 jta 更改为 jtf。否则它工作正常并突出显示聚光灯红色(我的颜色你可以设置成你想要的):

class project extends Frame { // implements ActionListener{

 Highlighter hilit;
 Highlighter.HighlightPainter painter;

JTextArea userField;
JTextField searchT;
JButton searchB;

public project(){


 userField = new JTextArea("spotlight aaa spotlight");
 searchT = new JTextField("spotlight");
 searchT.setEditable(true);
//     searchT.setBorder(new LineBorder (Color.black));

 searchB = new JButton("Search");

    hilit = new DefaultHighlighter();
    painter = new                    DefaultHighlighter.DefaultHighlightPainter(Color.red);





// JButton (searchB) with ActionListener 
 searchB.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt) {
    try {
        searchBActionPerformed(evt);
    } catch (BadLocationException ex) {
//            Logger.getLogger(DaWord.class.getName()).log(Level.SEVERE, null, ex);
      }
    }

       private void searchBActionPerformed(ActionEvent evt) throws BadLocationException  {
           Object sb = evt.getSource();
         if(searchB==sb){
       getSearch();

           }

       }
       private void getSearch() throws BadLocationException {

         // my jtextfield
       String jtf = searchT.getText();
        // my jtextarea
        String jta = userField.getText();

        hilit = userField.getHighlighter();
        hilit.removeAllHighlights();


 int index = jta.indexOf(jtf);

while(index >=0){
System.out.println("looping");


System.out.println("im searching for"+jtf+" "+index);
int len = jtf.length();
hilit.addHighlight(index,index+len, painter);
index = jta.indexOf(jtf, index+len);
System.out.println("this is what I want to highlight"+ index);
// remove hightlights with a timer for example after 10 seconds
}

}

});

setSize(500, 500);

setLayout(new FlowLayout());

add(userField);
add(searchT);
add(searchB);

setVisible(true);

}

}