Java JTextPane:突出显示注释行

Java JTextPane:突出显示注释行,java,swing,editor,highlight,jtextpane,Java,Swing,Editor,Highlight,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;

请看下面三个文件

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();      
              }        
            });        
          }       
    }  
Form.java
包装正常;
导入关键字.JavaKeywords;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.*;
导入javax.swing.text.*;
公共类窗体扩展了TorPane
{      
私有JTextPane textPane;
私人杰帕内尔南部;
私有JScrollPane滚动条;
私有列表关键字,文本;
私有字符串内容;
公共字符串文档类型;
私人风格,风格2;
私有关键字连接器java;
私人文件;
int开始、结束、偏移量1、长度1;
私人按钮;
JFrame框架;
公共表格()
{      
超级();
frame=新的JFrame();
//声明实例变量
textPane=新的JTextPane();
textPane.setMinimumSize(新尺寸(100100));
按钮=新按钮(“保存”);
addActionListener(新操作());
document=(DefaultStyledDocument)textPane.getDocument();
setDocumentFilter(新的HighlightFilter());
关键词=新ArrayList();
文字=新的ArrayList();
//添加样式
style=document.addStyle(“蓝色”,空);
设置前景(样式、颜色、蓝色);
style2=document.addStyle(“红色”,null);
setForeground(style2,Color.RED);
//创建主窗口
南=新JPanel();
south.setLayout(新的FlowLayout());
添加(按钮);
滚动=新建JScrollPane(文本窗格);
frame.getContentPane().add(滚动“居中”);
frame.getContentPane().add(南,“南”);
frame.setVisible(true);
框架。设置尺寸(800600);
frame.validate();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}     
私有类HighlightFilter扩展了DocumentFilter
{        
public void insertString(FilterBypass fb、int offset、String String、AttributeSet attr)
抛出BadLocationException{
如果(string.isEmpty()){
fb.插入字符串(偏移量、字符串、属性);
}否则{
super.insertString(fb,offset,string,attr);
偏移量1=偏移量;
length1=字符串。length()+偏移量;
System.out.println(string.length());
系统输出打印项次(“偏移量:+offset1+”长度:+length1);
突出显示();
}        
}        
公共无效删除(FilterBypass fb、整数偏移量、整数长度)
抛出BadLocationException{
如果(长度==0){
fb.移除(偏移、长度);
}否则{
超级。删除(fb、偏移、长度);
偏移量1=偏移量;
长度1=长度;
系统输出打印项次(“偏移量:+offset1+”长度:+length1);
突出显示();
}        
}        
公共void替换(FilterBypass fb、整数偏移量、整数长度、字符串文本、属性集属性)
抛出BadLocationException{
如果(长度==0&&text.isEmpty()){
fb.替换(偏移量、长度、文本、属性);
}否则{
super.replace(fb、偏移量、长度、文本、属性);
偏移量1=偏移量;
长度1=长度;
系统输出打印项次(“偏移量:+offset1+”长度:+length1);
突出显示();
}  } }      
专用空白突出显示()
{        
SwingUtilities.invokeLater(新的Runnable()
{        
int next=0;int end=0;
@凌驾
public void run(){
试试{
//content=document.getText(0,document.getLength());
int preWord=Utilities.getPreviousWord(文本窗格,偏移量1);

if(preWord将其添加到Form.actionPerformed(ActionEvent)方法的末尾


你的问题太不具体了。你不能扔掉一段代码,然后问“给我解决方案”。你必须先找出一个具体的问题并解释清楚。另外,请不要大声喊叫;使用斜体或(不太常见)粗体强调。@IngoKegel“你的问题是…”…看不见?问题是什么?大家好,谢谢你们的回答。@Ingo Kegel:嗨,实际上我已经将代码缩减到了我能达到的最大级别。Form.Java是一个1820行代码,所以我已经尽力缩减代码并隔离问题:)如果给您带来不便,请原谅:)@transhgod:嗨,我为我所犯的错误感到抱歉。我还是新来的,所以我肯定有很多东西要学:)。谢谢你的展示:)@Andrew:如果我的问题不是很清楚,请原谅。所以,我的问题是“我如何在实现上述两个选项的同时添加评论强调支持?”上面使用的正则表达式进行了一些严肃的测试,它们只涵盖了o
 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.");    
        }    

    }    
package Normal;  
import java.util.List;  

public interface KeywordConnector  
{  
    public List<String> getKeywords();  
    public List<String> getLiterals();  
    public List<String> getOthers();  
}
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);
}