2012-05-07 53 views
3

请看下面的三个文件。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();  
       }   
      });   
      }  
    } 

Keywords.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关键字,并开始凸显他们。正如你所看到的,这个程序没有办法突出注释行!我正在努力实现这个目标超过一周。

我可以在“//”符号和“/ *”“*”符号添加到关键字列表中,但随后发生的事情是,

  1. 当输入注释行,我得检查评论中的字母数量。那么只有我可以突出显示所有这些(或者我可以突出显示整个行,但是您知道它最终的样子)。但是,如果我将它添加到关键字,我不能这样做。

  2. 当评论“符号”被删除,整个有色意见函已被更改为“无颜色”

所以,我怎么可以添加注释亮点支持,实现上述两个提到?

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

+5

你的问题到底是太不具体。你不能转储一段代码,并要求“给我解决方案”。你必须首先分离出一个特定的问题并且清楚地解释它。 –

+0

另外,请不要_shout_;使用_italics_或(不太常用)** bold **来强调。 – trashgod

+0

@IngoKegel *“您的问题是......”* ..不可见?什么是问题? –

回答

3

它添加到Form.actionPerformed(动作事件)方法

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); 
} 
+1

正则表达式使用上面的湖一些严重的测试,他们只是涵盖了明显的情况。 – Zecas

+0

嗨,非常感谢您的代码,我非常感谢。但是,有一个小问题。我的Form.java文件中没有“actionPerformed(ActionEvent)”方法。所以,我将它添加到“dataCaller”方法和“高亮”方法。但是,它不起作用,它没有突出任何东西。请帮忙!! –

+0

是的,你说得对。我的意思是添加到方法的结尾Form.Action.actionPerformed – Zecas