如何在打开文件和用户键入时突出显示java中的关键字

如何在打开文件和用户键入时突出显示java中的关键字,java,swing,jtextarea,jtextpane,Java,Swing,Jtextarea,Jtextpane,因此,当用户打开.java文件或写入.java文件时,我试图突出显示java中的关键字,这些关键字存储在文本文件中。我想我知道如何判断文件的类型是否正确。但是,我不知道如何改变某些关键字的颜色。如果有人能帮上忙,那就太好了,因为现在很混乱。我想知道我是否能以某种方式使用replace函数。我试着用我掌握的几种方法来做这件事,但仍然不清楚。我去掉了大部分的方法和听众,只知道他们在那里,但为了便于阅读,我把它们保留了下来 import javax.swing.*; import java.awt.*

因此,当用户打开.java文件或写入.java文件时,我试图突出显示java中的关键字,这些关键字存储在文本文件中。我想我知道如何判断文件的类型是否正确。但是,我不知道如何改变某些关键字的颜色。如果有人能帮上忙,那就太好了,因为现在很混乱。我想知道我是否能以某种方式使用replace函数。我试着用我掌握的几种方法来做这件事,但仍然不清楚。我去掉了大部分的方法和听众,只知道他们在那里,但为了便于阅读,我把它们保留了下来

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;
import java.util.Scanner;
import java.io.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.Highlighter.HighlightPainter;
import javax.swing.text.JTextComponent;
import java.net.URI;
import java.util.*;

public class MyTextEditor extends JFrame implements ActionListener
{
  private JPanel panel = new JPanel(new BorderLayout());
  private JTextArea textArea = new JTextArea(0,0);
  private static final Color TA_BKGRD_CL = Color.BLACK;
  private static final Color TA_FRGRD_CL = Color.GREEN;
  private static final Color TA_CARET_CL = Color.WHITE;

  private JScrollPane scrollPane;
  private MenuBar menuBar = new MenuBar();


 public MyTextEditor()
 {

  this.setSize(750,800);
  this.setTitle("Zenith");
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  textArea.setFont(new Font("Consolas", Font.BOLD, 14));
  textArea.setForeground(TA_FRGRD_CL);
  textArea.setBackground(TA_BKGRD_CL);
  textArea.setCaretColor(TA_CARET_CL);
  scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
  scrollPane.setVisible(true);
  textArea.add(scrollPane,BorderLayout.EAST);
  final LineNumberingTextArea lineNTA = new LineNumberingTextArea(textArea);
  DocumentListener documentListen = new DocumentListener()
  {
     public void insertUpdate(DocumentEvent documentEvent)
     {
        lineNTA.updateLineNumbers();  
     }
     public void removeUpdate(DocumentEvent documentEvent)
     {
        lineNTA.updateLineNumbers();
     }
     public void changedUpdate(DocumentEvent documentEvent)
     {
        lineNTA.updateLineNumbers();
     }
  };
  textArea.getDocument().addDocumentListener(documentListen);
  // Line numbers
  lineNTA.setBackground(Color.BLACK);
  lineNTA.setForeground(Color.WHITE);
  lineNTA.setFont(new Font("Consolas", Font.BOLD, 13));
  lineNTA.setEditable(false);
  lineNTA.setVisible(true);
  textArea.add(lineNTA);
  scrollPane.setVisible(true);
  scrollPane.add(textArea);

  getContentPane().add(scrollPane);

 }


public void findKeyWords(String ext)
{
  ArrayList<String> wordsInTA = new ArrayList<String>();
  int index = 0;

  if(ext == "java")
  {
     for(String line : textArea.getText().split(" "))
     {
        wordsInTA.add(line);
        index++;
     }
     try
     {

      while(index>0)
      {
           String temp = wordsInTA.get(index);
           boolean isKeyWord = binarySearch(temp);
           if(isKeyWord)
           {
             //Code that has not yet been made
           } 
           index--;    
     }
   }
   catch(IOException ex)
     {
        ex.printStackTrace();
     }
  }

}
private ArrayList<String> loadJavaWords() throws FileNotFoundException
{
  ArrayList<String> javaWords = new ArrayList<String>();
  Scanner scan = new Scanner(new File("JavaKeyWords.txt"));
  while(scan.hasNext())
  {
     javaWords.add(scan.next());
  }
  scan.close();
  return javaWords;
}
private boolean binarySearch(String word) throws FileNotFoundException
{
  ArrayList<String> javaWords = loadJavaWords();
  int min = 0;
  int max = javaWords.size()-1;
  while(min <= max)
  {
     int index = (max + min)/2;
     String guess = javaWords.get(index);
     int result = word.compareTo(guess);
     if(result == 0)
     {
        return true;
     }
     else if(result > 0)
     {
        min = index +1;
     }
     else if(result < 0)
     {
        max = index -1;
     }
  }
  return false;
}

public void replace()
{
  String wordToSearch = JOptionPane.showInputDialog(null, "Word to replace:");
  String wordToReplace = JOptionPane.showInputDialog(null, "Replacement word:");

  int m;
  int total = 0;
  int wordLength = wordToSearch.length();
  for (String line : textArea.getText().split("\\n")) 
  {
     m = line.indexOf(wordToSearch);
     if(m == -1)
     {
        total += line.length() + 1; 
        continue;
     }

     String newLine = line.replaceAll(wordToSearch, wordToReplace);
     textArea.replaceRange(newLine, total, total + line.length());
     total += newLine.length() + 1;
  }
}

public static void main(String args[])
{
  MyTextEditor textEditor = new MyTextEditor();
  textEditor.setVisible(true);
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.event.DocumentListener;
导入javax.swing.event.DocumentEvent;
导入java.util.Scanner;
导入java.io.*;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DefaultHighlighter;
导入javax.swing.text.Highlighter;
导入javax.swing.text.Highlighter.HighlightPainter;
导入javax.swing.text.JTextComponent;
导入java.net.URI;
导入java.util.*;
公共类MyTextEditor扩展JFrame实现ActionListener
{
private JPanel panel=new JPanel(new BorderLayout());
私有JTextArea textArea=新JTextArea(0,0);
专用静态最终颜色TA_BKGRD_CL=Color.BLACK;
专用静态最终颜色TA_FRGRD_CL=Color.GREEN;
专用静态最终颜色TA_插入符号CL=Color.WHITE;
私有JScrollPane滚动窗格;
私有菜单栏菜单栏=新菜单栏();
公共MyTextEditor()
{
这个。设置大小(750800);
本文件为setTitle(“天顶”);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setFont(新字体(“Consolas”,Font.BOLD,14));
textArea.setForeground(TA_FRGRD_CL);
textArea.立根点(TA_BKGRD_CL);
textArea.setCaretColor(TA_CARET_CL);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HorizontalScrollBar\uAlways);
scrollPane.setVisible(true);
添加(滚动窗格,BorderLayout.EAST);
最终LineNumberingTextArea lineNTA=新的LineNumberingTextArea(textArea);
DocumentListener DocumentListener=新建DocumentListener()
{
公共作废插入更新(DocumentEvent DocumentEvent)
{
lineNTA.updateLineNumbers();
}
公共作废移除更新(DocumentEvent DocumentEvent)
{
lineNTA.updateLineNumbers();
}
public void changedUpdate(DocumentEvent DocumentEvent)
{
lineNTA.updateLineNumbers();
}
};
textArea.getDocument().addDocumentListener(documentListen);
//行号
线条背景(颜色:黑色);
lineNTA.设置前景(颜色:白色);
lineNTA.setFont(新字体(“Consolas”,Font.BOLD,13));
lineNTA.setEditable(false);
lineNTA.setVisible(真);
textArea.add(lineNTA);
scrollPane.setVisible(true);
滚动窗格。添加(文本区域);
getContentPane().add(滚动窗格);
}
公共void findKeyWords(字符串扩展)
{
ArrayList wordsInTA=新的ArrayList();
int指数=0;
如果(ext==“java”)
{
for(字符串行:textArea.getText().split(“”)
{
添加(行);
索引++;
}
尝试
{
而(索引>0)
{
字符串temp=wordsInTA.get(索引);
布尔值isKeyWord=binarySearch(temp);
if(isKeyWord)
{
//尚未生成的代码
} 
索引--;
}
}
捕获(IOEX异常)
{
例如printStackTrace();
}
}
}
私有ArrayList loadJavaWords()引发FileNotFoundException
{
ArrayList javaWords=新的ArrayList();
扫描仪扫描=新扫描仪(新文件(“JavaKeyWords.txt”);
while(scan.hasNext())
{
add(scan.next());
}
scan.close();
返回javaWords;
}
私有布尔二进制搜索(字符串字)引发FileNotFoundException
{
ArrayList javaWords=loadJavaWords();
int min=0;
int max=javaWords.size()-1;
而(最小0)
{
最小值=指数+1;
}
否则如果(结果<0)
{
max=指数-1;
}
}
返回false;
}
公营机构
{
字符串wordToSearch=JOptionPane.showInputDialog(null,“要替换的单词:”);
字符串wordToReplace=JOptionPane.showInputDialog(null,“替换字:”);
int m;
int-total=0;
int-wordLength=wordToSearch.length();
用于(字符串行:textArea.getText().split(\\n”))
{
m=行索引of(wordToSearch);
如果(m==-1)
{
总计+=行长度()+1;
继续;
}
字符串newLine=line.replaceAll(wordToSearch,wordToReplace);
textArea.replaceRange(换行、合计、合计+行.length());
合计+=换行符长度()+1;
}
}
公共静态void main(字符串参数[])
{
MyTextEditor=新建MyTextEditor();
setVisible(true);
}

}

这绝对不是一个最小的、完整的、可验证的例子。请参阅:您的意思是希望ui突出显示上的单词,并将突出显示保存在文件中?该示例演示了一种实时高亮显示的方法。由于它的工作方式,它应该能够将文本设置为well@Abhinav-虽然有人在这里提供帮助,但很少有人有时间处理这么长的代码&您得到答案的机会将减少。请具体一点,简短一点。@ChrisKitching这是个很好的建议。提示:在注释中键入
[mcve]
将自动展开为。