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