请查看以下三个文件。
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关键字并开始突出显示它们。如您所见,此程序无法突出显示注释行!我现在试图实现这一目标超过一周。
我可以将'//'符号和'/ *''*'符号添加到关键字列表中,但接下来会发生什么,
输入评论行时,我必须检查评论中的字母数。然后只有我可以突出显示所有这些(或者我可以突出显示整个行,但你知道它在最后的样子)。但如果我将其添加到关键字,我就无法做到。
删除评论“符号”时,必须将全彩色评论信改为“无颜色”
那么,如何通过实现上述两个提及添加注释突出显示支持?
请帮我解决这个问题!!谢谢......
答案 0 :(得分:3)
将其添加到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);
}