Please view the following three files.
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();
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();
style = document.addStyle("blue", null);
StyleConstants.setForeground(style, Color.BLUE);
style2 = document.addStyle("red", null);
StyleConstants.setForeground(style2, Color.RED);
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 {
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()
{
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");
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();
}
What happens when the user clicks the save button, the program will search for Java keywords and start highlighting them. As you can see, there is no way in this program to highlight comment lines! I have been trying to achieve this for more than a week.
I can add the characters '//' and the characters '/ *' '*' to the list of keywords, but then what happens
When the comment line is entered, I have to check the number of letters in the comment. Then only I can highlight ALL of them (otherwise I can highlight WHOLE ROW, but you know how it looks at the end). But if I add it to the keywords, I cannot do it.
"" , " "
, ?
, ! ...