gpt4 book ai didi

java - JTextPane:突出显示注释行

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:58:07 27 4
gpt4 key购买 nike

请看下面三个文件。

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

}

关键字连接器.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. 当注释“符号”被删除时,整个彩色注释字母必须更改为“无颜色”

那么,如何在实现上述两个提及的情况下添加评论突出显示支持?

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

最佳答案

将此添加到 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);
}

关于java - JTextPane:突出显示注释行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10479320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com