编程语言
首页 > 编程语言> > Java-JTextPane:突出显示注释行

Java-JTextPane:突出显示注释行

作者:互联网

请看以下三个文件.

Form.java 

  package Normal;      

import Keywords.JavaKeywords;    
import java.awt.Color;    
import java.awt.Dimension;    
import java.awt.FlowLayout;    
import java.awt.event.ActionEvent;    
import java.awt.event.ActionListener;    
import java.util.ArrayList;    
import java.util.List;    
import java.util.logging.Level;    
import java.util.logging.Logger;    
import javax.swing.*;    
import javax.swing.text.*;    

    public class Form extends JEditorPane      
    {      
        private JTextPane textPane;      
        private JPanel south;    
        private JScrollPane scroll;      
        private List<String> keywords, literals;     
        private String  content;      
        public String documentType;                
        private Style style, style2;               
        private KeywordConnector java;               
        private DefaultStyledDocument document;          
        int start, end, offset1,length1;         
        private JButton button;             
        JFrame frame;    


        public Form()      
        {      
            super();    
              frame = new JFrame();    

            //Declaring the instance variables      
            textPane = new JTextPane();      
            textPane.setMinimumSize(new Dimension(100,100));      

            button = new JButton("Save");      
            button.addActionListener(new Action());     

            document = (DefaultStyledDocument) textPane.getDocument();        
            document.setDocumentFilter(new HighlightFilter());      

            keywords = new ArrayList();       
            literals = new ArrayList();       

            //Adding Styles      
            style = document.addStyle("blue", null);        
            StyleConstants.setForeground(style, Color.BLUE);                    
            style2 = document.addStyle("red", null);      
            StyleConstants.setForeground(style2, Color.RED);                

            //Creating the main window     
            south = new JPanel();      
            south.setLayout(new FlowLayout());      
            south.add(button);                          
            scroll = new JScrollPane(textPane);      

            frame.getContentPane().add(scroll,"Center");      
            frame.getContentPane().add(south,"South");                  
            frame.setVisible(true);    
            frame.setSize(800,600);    
            frame.validate();    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                          
        }     

        private class HighlightFilter extends DocumentFilter       
        {        

        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)        
                throws BadLocationException {        
          if (string.isEmpty()) {        
            fb.insertString(offset, string, attr);            


          } else {        
            super.insertString(fb, offset, string, attr);        
             offset1 = offset;    
            length1 = string.length()+offset;    
            System.out.println(string.length());    

            System.out.println("Offset: "+offset1+" Length: "+length1);    
            highlight();        
          }        
        }        

        public void remove(FilterBypass fb, int offset, int length)        
                throws BadLocationException {        
          if (length == 0) {        
            fb.remove(offset, length);        
          } else {        
            super.remove(fb, offset, length);        
            offset1 = offset;    
            length1 = length;    
             System.out.println("Offset: "+offset1+" Length: "+length1);    
            highlight();        
          }        
        }        

        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)        
                throws BadLocationException {        
          if (length == 0 && text.isEmpty()) {        
            fb.replace(offset, length, text, attrs);        
          } else {        
            super.replace(fb, offset, length, text, attrs);        
             offset1 = offset;    
            length1 = length;    
             System.out.println("Offset: "+offset1+" Length: "+length1);    
             highlight();      
          }  } }      

        private void highlight()       
        {        
              SwingUtilities.invokeLater(new Runnable()       
              {        
                  int next=0; int end=0;    

                @Override        
                public void run() {        
                  try {        
                        //content = document.getText(0, document.getLength());     

                        int preWord =Utilities.getPreviousWord(textPane, offset1);    

                        if(preWord<0)    
                        {    
                            preWord=preWord*-1;    
                        }    
                        System.out.println("Previous Word: "+preWord);    

                        int wordEnd = Utilities.getWordEnd(textPane, offset1);    

                        System.out.println("Word End: "+wordEnd);    

                       System.out.println("The Text: "+document.getText(preWord,wordEnd-preWord));    

                       content = document.getText(preWord,(wordEnd-preWord)-1);    

                       System.out.println("Length: "+(wordEnd-preWord));    

                    for (String word : content.split("\\s")) {        
                    next = content.indexOf(word, next);        
                     end = next + word.length();        

                     document.setCharacterAttributes(preWord, word.length(),        
                     textPane.getStyle(keywords.contains(word) ? "blue" : literals.contains(word)? "red":"default"),true);        
                     next = end;        
                }        
              } catch (BadLocationException ex) {        
                ex.printStackTrace();        
              }        
            }        
          });        
            }      

        private class Action implements ActionListener      
        {      
            public void actionPerformed(ActionEvent ae)      
            {                     
                java = new JavaKeywords();              
                keywords = java.getKeywords();      
                literals = java.getLiterals();      


                int next=0; int end=0;    
            try {    
                content = document.getText(0, document.getLength());    
            } catch (BadLocationException ex) {    
                Logger.getLogger(Form.class.getName()).log(Level.SEVERE, null, ex);    
            }    

                for (String word : content.split("\\s")) {        
                    next = content.indexOf(word, next);        
                     end = next + word.length();        

                     document.setCharacterAttributes(next, end,        
                     textPane.getStyle(keywords.contains(word) ? "blue" : literals.contains(word)? "red":"default"),true);        
                     next = end;        
                }        
            }      
        }      

       public static void main(String[] args) throws Exception {       
            SwingUtilities.invokeLater(new Runnable()       
            {        
              @Override        
              public void run() {        
               Form f = new Form();      
              }        
            });        
          }       
    }  

关键字.java

 package Keywords;    

    import Normal.KeywordConnector;    
    import java.util.ArrayList;    
    import java.util.List;    
    import keywords.Literals;    

    public class JavaKeywords implements KeywordConnector     
    {    
        private ArrayList list, literals;    

        public JavaKeywords()    
        {    
            //Default Keywords    
            list = new ArrayList();    

            list.add("abstract");    
            list.add("assert");            
            list.add("break");    
            list.add("byte");    
            list.add("case");    
            list.add("catch");    
            list.add("char");    
            list.add("class");    


            //Literals    
            String string = "String";    

            literals = new ArrayList();    
            literals.add(string);    
            literals.add("bool");    
            literals.add("int");    
            literals.add("Double");    
            literals.add("float");    
            literals.add("char");    
            literals.add("long");    
            literals.add("byte");    

        }    


        @Override    
        public ArrayList getKeywords()    
        {    
            return list;    
        }    

        @Override    
        public List<String> getLiterals()     
        {    
            return literals;    
        }    

        @Override    
        public List getOthers() {    
            throw new UnsupportedOperationException("Not supported yet.");    
        }    

    }    

KeywordConnector.java

package Normal;  
import java.util.List;  

public interface KeywordConnector  
{  
    public List<String> getKeywords();  
    public List<String> getLiterals();  
    public List<String> getOthers();  
}

这里发生的是,当用户单击保存按钮时,程序将搜索Java关键字并开始突出显示它们.如您所见,该程序无法突出显示注释行!我现在已经尝试了一个多星期.

我可以将’//’符号和’/ *”*’符号添加到关键字列表中,但是接下来会发生的是,

>输入注释行时,我必须检查注释中的字母数.然后只有我可以突出显示所有这些(否则,我可以突出显示“整行”,但是您知道最后的样子).但是,如果我将其添加到关键字中,我将无法做到.
>删除注释“符号”时,必须将“全色注释字母”更改为“无颜色”

因此,如何通过实现上述两个提及来添加注释突出显示支持?

请帮我解决这个问题!谢谢…

解决方法:

将此添加到Form.actionPerformed(ActionEvent)方法的末尾

Pattern singleLinecommentsPattern = Pattern.compile("\\/\\/.*");
Matcher matcher = singleLinecommentsPattern.matcher(content);

while (matcher.find()) {
    document.setCharacterAttributes(matcher.start(), 
      matcher.end() - matcher.start(), textPane.getStyle("red"), true);
}

Pattern multipleLinecommentsPattern = Pattern.compile("\\/\\*.*?\\*\\/",
                        Pattern.DOTALL);
matcher = multipleLinecommentsPattern.matcher(content);

while (matcher.find()) {
    document.setCharacterAttributes(matcher.start(), 
      matcher.end() - matcher.start(), textPane.getStyle("red"), true);
}

标签:jtextpane,highlight,swing,editor,java
来源: https://codeday.me/bug/20191201/2080242.html