源碼編譯器
A. java源代碼編輯器 設計用於編寫Java源代碼的編輯器,基本要求:可以完成源程序的文件打開,編輯和文件保存
一. 高亮的內容:
需要高亮的內容有:
1. 關鍵字, 如 public, int, true 等.
2. 運算符, 如 +, -, *, /等
3. 數字
4. 高亮字元串, 如 "example of string"
5. 高亮單行注釋
6. 高亮多行注釋
二. 實現高亮的核心方法:
StyledDocument.setCharacterAttributes(int offset, int length, AttributeSet s, boolean replace)
三. 文本編輯器選擇.
Java中提供的多行文本編輯器有: JTextComponent, JTextArea, JTextPane, JEditorPane等, 都可以使用. 但是因為語法著色中文本要使用多種風格的樣式, 所以這些文本編輯器的document要使用StyledDocument.
JTextArea使用的是PlainDocument, 此document不能進行多種格式的著色.
JTextPane, JEditorPane使用的是StyledDocument, 默認就可以使用.
為了實現語法著色, 可以繼承自DefaultStyledDocument, 設置其為這些文本編輯器的documet, 或者也可以直接使用JTextPane, JEditorPane來做. 為了方便, 這里就直接使用JTextPane了.
四. 何時進行著色.
當文本編輯器中有字元被插入或者刪除時, 文本的內容就發生了變化, 這時檢查, 進行著色.
為了監視到文本的內容發生了變化, 要給document添加一個DocumentListener監聽器, 在他的removeUpdate和insertUpdate中進行著色處理.
而changedUpdate方法在文本的屬性例如前景色, 背景色, 字體等風格改變時才會被調用.
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
try {
colouring((StyledDocument) e.getDocument(), e.getOffset(), e.getLength());
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
@Override
public void removeUpdate(DocumentEvent e) {
try {
// 因為刪除後游標緊接著影響的單詞兩邊, 所以長度就不需要了
colouring((StyledDocument) e.getDocument(), e.getOffset(), 0);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
五. 著色范圍:
pos: 指變化前游標的位置.
len: 指變化的字元數.
例如有關鍵字public, int
單詞"publicint", 在"public"和"int"中插入一個空格後變成"public int", 一個單詞變成了兩個, 這時對"public" 和 "int"進行著色.
著色范圍是public中p的位置和int中t的位置加1, 即是pos前面單詞開始的下標和pos+len開始單詞結束的下標. 所以上例中要著色的范圍是"public int".
提供了方法indexOfWordStart來取得pos前單詞開始的下標, 方法indexOfWordEnd來取得pos後單詞結束的下標.
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個非單詞字元.
for (; pos > 0 && isWordCharacter(doc, pos - 1); --pos);
return pos;
}
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個非單詞字元.
for (; isWordCharacter(doc, pos); ++pos);
return pos;
}
一個字元是單詞的有效字元: 是字母, 數字, 下劃線.
public boolean isWordCharacter(Document doc, int pos) throws BadLocationException {
char ch = getCharAt(doc, pos); // 取得在文檔中pos位置處的字元
if (Character.isLetter(ch) || Character.isDigit(ch) || ch == '_') { return true; }
return false;
}
所以著色的范圍是[start, end] :
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
六. 關鍵字著色.
從著色范圍的開始下標起進行判斷, 如果是以字母開或者下劃線開頭, 則說明是單詞, 那麼先取得這個單詞, 如果這個單詞是關鍵字, 就進行關鍵字著色, 如果不是, 就進行普通的著色. 著色完這個單詞後, 繼續後面的著色處理. 已經著色過的字元, 就不再進行著色了.
public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {
// 取得插入或者刪除後影響到的單詞.
// 例如"public"在b後插入一個空格, 就變成了:"pub lic", 這時就有兩個單詞要處理:"pub"和"lic"
// 這時要取得的范圍是pub中p前面的位置和lic中c後面的位置
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
char ch;
while (start < end) {
ch = getCharAt(doc, start);
if (Character.isLetter(ch) || ch == '_') {
// 如果是以字母或者下劃線開頭, 說明是單詞
// pos為處理後的最後一個下標
start = colouringWord(doc, start);
} else {
//SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
++start;
}
}
}
public int colouringWord(StyledDocument doc, int pos) throws BadLocationException {
int wordEnd = indexOfWordEnd(doc, pos);
String word = doc.getText(pos, wordEnd - pos); // 要進行著色的單詞
if (keywords.contains(word)) {
// 如果是關鍵字, 就進行關鍵字的著色, 否則使用普通的著色.
// 這里有一點要注意, 在insertUpdate和removeUpdate的方法調用的過程中, 不能修改doc的屬性.
// 但我們又要達到能夠修改doc的屬性, 所以把此任務放到這個方法的外面去執行.
// 實現這一目的, 可以使用新線程, 但放到swing的事件隊列里去處理更輕便一點.
SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));
} else {
SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
}
return wordEnd;
}
因為在insertUpdate和removeUpdate方法中不能修改document的屬性, 所以著色的任務放到這兩個方法外面, 所以使用了SwingUtilities.invokeLater來實現.
private class ColouringTask implements Runnable {
private StyledDocument doc;
private Style style;
private int pos;
private int len;
public ColouringTask(StyledDocument doc, int pos, int len, Style style) {
this.doc = doc;
this.pos = pos;
this.len = len;
this.style = style;
}
public void run() {
try {
// 這里就是對字元進行著色
doc.setCharacterAttributes(pos, len, style, true);
} catch (Exception e) {}
}
}
七: 源碼
關鍵字著色的完成代碼如下, 可以直接編譯運行. 對於數字, 運算符, 字元串等的著色處理在以後的教程中會繼續進行詳解.
import java.awt.Color;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class HighlightKeywordsDemo {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTextPane editor = new JTextPane();
editor.getDocument().addDocumentListener(new SyntaxHighlighter(editor));
frame.getContentPane().add(editor);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
}
}
/**
* 當文本輸入區的有字元插入或者刪除時, 進行高亮.
*
* 要進行語法高亮, 文本輸入組件的document要是styled document才行. 所以不要用JTextArea. 可以使用JTextPane.
*
* @author Biao
*
*/
class SyntaxHighlighter implements DocumentListener {
private Set<String> keywords;
private Style keywordStyle;
private Style normalStyle;
public SyntaxHighlighter(JTextPane editor) {
// 准備著色使用的樣式
keywordStyle = ((StyledDocument) editor.getDocument()).addStyle("Keyword_Style", null);
normalStyle = ((StyledDocument) editor.getDocument()).addStyle("Keyword_Style", null);
StyleConstants.setForeground(keywordStyle, Color.RED);
StyleConstants.setForeground(normalStyle, Color.BLACK);
// 准備關鍵字
keywords = new HashSet<String>();
keywords.add("public");
keywords.add("protected");
keywords.add("private");
keywords.add("_int9");
keywords.add("float");
keywords.add("double");
}
public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {
// 取得插入或者刪除後影響到的單詞.
// 例如"public"在b後插入一個空格, 就變成了:"pub lic", 這時就有兩個單詞要處理:"pub"和"lic"
// 這時要取得的范圍是pub中p前面的位置和lic中c後面的位置
int start = indexOfWordStart(doc, pos);
int end = indexOfWordEnd(doc, pos + len);
char ch;
while (start < end) {
ch = getCharAt(doc, start);
if (Character.isLetter(ch) || ch == '_') {
// 如果是以字母或者下劃線開頭, 說明是單詞
// pos為處理後的最後一個下標
start = colouringWord(doc, start);
} else {
SwingUtilities.invokeLater(new ColouringTask(doc, start, 1, normalStyle));
++start;
}
}
}
/**
* 對單詞進行著色, 並返回單詞結束的下標.
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public int colouringWord(StyledDocument doc, int pos) throws BadLocationException {
int wordEnd = indexOfWordEnd(doc, pos);
String word = doc.getText(pos, wordEnd - pos);
if (keywords.contains(word)) {
// 如果是關鍵字, 就進行關鍵字的著色, 否則使用普通的著色.
// 這里有一點要注意, 在insertUpdate和removeUpdate的方法調用的過程中, 不能修改doc的屬性.
// 但我們又要達到能夠修改doc的屬性, 所以把此任務放到這個方法的外面去執行.
// 實現這一目的, 可以使用新線程, 但放到swing的事件隊列里去處理更輕便一點.
SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));
} else {
SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));
}
return wordEnd;
}
/**
* 取得在文檔中下標在pos處的字元.
*
* 如果pos為doc.getLength(), 返回的是一個文檔的結束符, 不會拋出異常. 如果pos<0, 則會拋出異常.
* 所以pos的有效值是[0, doc.getLength()]
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public char getCharAt(Document doc, int pos) throws BadLocationException {
return doc.getText(pos, 1).charAt(0);
}
/**
* 取得下標為pos時, 它所在的單詞開始的下標. ±wor^d± (^表示pos, ±表示開始或結束的下標)
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個非單詞字元.
for (; pos > 0 && isWordCharacter(doc, pos - 1); --pos);
return pos;
}
/**
* 取得下標為pos時, 它所在的單詞結束的下標. ±wor^d± (^表示pos, ±表示開始或結束的下標)
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個非單詞字元.
for (; isWordCharacter(doc, pos); ++pos);
return pos;
}
/**
* 如果一個字元是字母, 數字, 下劃線, 則返回true.
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public boolean isWordCharacter(Document doc, int pos) throws BadLocationException {
char ch = getCharAt(doc, pos);
if (Character.isLetter(ch) || Character.isDigit(ch) || ch == '_') { return true; }
return false;
}
@Override
public void changedUpdate(DocumentEvent e) {
}
@Override
public void insertUpdate(DocumentEvent e) {
try {
colouring((StyledDocument) e.getDocument(), e.getOffset(), e.getLength());
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
@Override
public void removeUpdate(DocumentEvent e) {
try {
// 因為刪除後游標緊接著影響的單詞兩邊, 所以長度就不需要了
colouring((StyledDocument) e.getDocument(), e.getOffset(), 0);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
/**
* 完成著色任務
*
* @author Biao
*
*/
private class ColouringTask implements Runnable {
private StyledDocument doc;
private Style style;
private int pos;
private int len;
public ColouringTask(StyledDocument doc, int pos, int len, Style style) {
this.doc = doc;
this.pos = pos;
this.len = len;
this.style = style;
}
public void run() {
try {
// 這里就是對字元進行著色
doc.setCharacterAttributes(pos, len, style, true);
} catch (Exception e) {}
}
}
}
B. 推薦個好用的代碼編輯器,謝謝
Netbeans (需額外再裝對應的編譯器,java不要了)
詳細介紹
http://ke..com/view/553506.htm
不滿意的話上網路搜 「代碼編輯器」 吧
C. html代碼編輯器編輯出來的代碼怎麼用
其實你新建一個txt文檔,命名之後,將文件的後綴名改為html也可以,新手可以直接用txt文本編輯,用dreamwaver
CS5工具可以快速編輯並隨時查看頁面效果,保存的文件就是html文件,雙擊可以打開你做的網頁,但是這個只是靜態頁面,裡面的內容都是固定的。
D. 開發人員眼中最好的代碼編輯器是誰
不同語言的開發人員會有不同的選擇,比如.net平台的開發人員肯定認為微軟的編輯器最好了。java平台的一般都是選擇eclipse或IntelliJ。前端工程師一般都選擇Sublime 。
所以這個問題沒有標准答案,不同平台不同語言會有不同的選擇。而且很多時候也看個人的使用習慣。
E. 代碼編輯器Ultraedit 18中文版哪裡可以下載!!!
網路一下就能找到資源下載。
UltraEdit 是一款支持文本,HTML、PHP、Perl、Java 和 JavaScript 等眾多流行計算機高級語言的程序編輯器。與Notepad ++相比,UltraEdit支持十六進制編輯,甚至你可以直接用它來修改exe和dll文件。它擁有強大的方案和工作區,有著可以處理復雜的軟體開發的能力。即便如此,UltraEdit 仍然保持著布局清晰、靈活精煉的特點!它易於定製,你可以在Web開發者、技術作者、程序員、系統管理員、記事本替換、超級用戶等不同的身份的使用者之間一鍵切換。當然,也因為其功能眾多,啟動速度要比Notepad ++慢很多,所以它並非是最好的記事本替代軟體。
UltraEdit 18 功能簡介:
1.可配置語法加亮,支持代碼折疊、Unicode;在32 位 Windows 平台上進行 64 位文件處理。
2.基於磁碟的文本編輯和支持超過 4GB 的大文件處理,即使是數兆位元組的文件也只佔用極少的內存;
3.在所有搜索操作(查找、替換、在文件中查找、在文件中替換)中,支持多行查找和替換對話框;
4.帶有 100,000 個單詞的拼寫檢查器,對 C/C++、VB、HTML、Java 和 Perl 進行了預配置;
5.內置 FTP 客戶端,支持登錄和保存多個賬戶,支持SSH/Telnet 窗口;
6.提供預定義的或用戶創建的編輯「環境」,能記住 UltraEdit 的所有可停靠窗口、工具欄等的狀態;
7.集成腳本語言以自動執行任務,可配置鍵盤映射,列/塊模式編輯,命名的模板;
8.十六進制編輯器可以編輯任何二進制文件,並顯示二進制和 ASCII 視圖;
9.HTML 工具欄,對常用的 HTML 功能作了預配置;文件加密/解密;多位元組和集成的 IME。
10.網路搜索工具欄:高亮顯示文本並單擊網路搜索工具欄按鈕,從編輯器內啟動搜索加亮詞語;
F. 最好用的代碼編輯器是什麼
首先編輯器的話那就是直接把ide分開了,直接是純粹的編輯器。
一千個人眼中有一千個哈姆雷特,我就說是我心目中的最好的前端編輯器是webstore,但是假如講點良心的話,就是vscode,畢竟vscode是開源的,然後我暫時用的是破解版webstore,同時通俗來講webstore算是一個ide,哈哈。
下面這段話我很贊同
(摘錄自知乎:webstore
1.內置zencode編碼風格,讓你快速開發
2.豐富的插件資源,你可以去webstormw官網下載你需要的插件
3.簡單易操作的版本控制,只要你簡單的配置下git或svn就可以使用快捷鍵快速的進行版本控制
4.實時保存,不用頻繁的按ctrl+s了
5.對nodejs,typeScript,coffeScript支持良好
6.定製化功能很強大,不管是編碼還是UI
缺點:啟動慢,占內存
作者:陳威
鏈接:https://www.hu.com/question/20936155/answer/18620572
來源:知乎)
vscode 也一直在成長,但是總是用著沒有webstore那麼順手。
G. Java源代碼編輯器
jcreator 用英文版的 漢化有些功能沒有 比如剪貼板 優點就是簡單易用
eclipse 非常強的 但有些復雜 比較適合專業點的人
H. 源碼編輯器的四大要素是什麼
GCC編譯分布
預編譯:gcc -E -o index.i index.c
編譯:gcc -S -o index.s index.i
匯編:gcc -c -o index.o index.s
鏈接:gcc index.o -o index
I. 有沒有好用的代碼編輯器。做HTML用的。最好有那種語法提示的
溫馨提示:僅供個人使用,切勿傳播,希望可以幫助您
1、解壓文件包之後雙擊打開「Sublime Text Build 3211 x64 Setup.exe」
2、選擇軟體要安裝的目錄,然後點擊「Next」
3、點擊「Next」
4、點擊「Install」開始安裝
5、等待安裝
6、點擊「Finish」完成安裝
連接:Sublime Text最新版
J. 源碼編輯器怎麼做貪吃蛇
首先看你要用的平台。可以用mfc界面,也可以C++黑框控制台。下面針對黑框,我說說思路。首先,黑框可以控制背景顏色,可以將蛇的顏色和背景色區分開,然後每次while循環就更新一下蛇所在的位置,這樣每次更細在視覺上看起來像蛇在動。