⑴ 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) {}
}
}
}
⑵ 讓人得心應手的python編輯器有哪些
一款順手的好的編輯器可以讓程序員寫代碼更得心應手,效率也會更高,但是編輯器本身沒有好壞,只有使用者使用起來是否順手而已,這里簡單給大家介紹幾款常用的可以編輯Python的軟體。
一、終端直接編寫
windows系統:Win+r,然後在運行框中輸入cmd即可打開終端。MAC系統:可以在Launchpad中直接打開終端。
簡單說明(針對上圖數字處說明)
1、Python3:說明我們的代碼是使用的python3的版本,目前有python2和python3兩個版本,毫無疑問python3是比較新的版本也是官方推薦的版本,如果想使用python2的代碼的話只需要寫python就就行了,不需要加數字2了。
2、版本信息:這一段是寫完python3之後自動生成的,主要是介紹一下我們當前的版本
3、編寫代碼:「>>>」表示當前進入python的編輯頁面,print(「hello,Python」)是我們的第一行python代碼,一個列印功能的函數,所有語言的學習幾乎都是從「hello ,World」或者「hello,XX」開始的。
4、執行結果:「hello,Python」就是我們第三個代碼執行的列印結果,這就是我們的第一個python程序。
5、補充說明:這個功能多數僅僅只用於測試一些函數功能等等,很少直接用於開發。
二、vim編輯器
打開vim編輯器,在終端中輸入:vim + 文件名的方式。vim表示進入vim編輯器的命令,hello.py表示我創建的一個python文件,而且會把我寫的代碼保存在hello.py文件中回車執行進入vim界面。
進入vim界面的時候默認是不可以被編輯,如果我們要編輯,需要先按下字母「i」鍵,才能編寫代碼。還是寫上我們的第一句代碼 print(「hello,Python」),這時候我們如果有很多行代碼可以一直寫下去,當我們把代碼寫完了,需要退出vim頁面,在終端中才能執行我們的代碼,所以vim只能編寫代碼。
那要怎麼樣才能退出vim編輯頁面呢?
按ESC鍵:下面的–INSERT–就會消失。在按「 :wq 」鍵,w:表示保存,q:表示退出。然後就可以又回到終端頁面了。
退出到終端頁面,我們可以用python3+「要執行的python文件」,來執行程序,其中hello,python就是我們執行出來的結果。
三、IDLE
IDLE是 python 程序自帶的IDE開發工具,伴隨著python的安裝自動安裝的。IDLE的使用和在終端中使用方法一樣,但是多了代碼高亮等功能,所以IDLE就不多給大家介紹了。
相關推薦:《Python視頻教程》
四、HBuilder
HBuilder是一款主要從事Web開發的軟體,支持很多類庫,擴展性強,但是比較龐雜冗餘
五、Atom
Atom如果需要運行Python程序,需要下載插件,但是Atom下載插件需要FQ,所以相對於小白來說有點復雜了,需要下載atom-python-run或者script插件,具體怎麼安裝,大家自行網路去吧,我就不多說了。
打開Atom軟體,File->New flie 然後創建一個文件以.py結尾即可。
六、sublime Text
Sublime Text功能強悍,但是又不會有太多冗餘的功能,界面風格簡潔,同時支持Windows/MAC/Linux等操作系統,也是本人比較推薦的一款軟體。
打sublime Text選擇File -> New file創建一個以.py結尾的文件即可,執行使用control+b
七、PyCharm
PyCharm是一種Python IDE,其擴展功能也很豐富。
打開PyCharm編輯器Create New Project ->選擇PurePython
創建好項目後就開始創建文件File -> New File創建一個以.py結尾的文件即可
八、總結
終端:操作簡單,多用於功能和函數測試,不適合項目開發。
vim:便捷快速,沒有任何多餘的冗雜的亂七八糟的功能,可以用於開發。
IDLE:是python自帶的編譯器,相當於vim的增強版。
HBuilder:是一款功能強大的編譯器,插件也非常齊全,但是多用與Web的開發,所以python開發不經常使用。
Atom:和HBuilder一樣也是一款插件和功能都非常強大的編譯器,但是缺點是運行的文件量大的話會卡頓。
sublime Text:是一款插件齊全,但是又沒有太多冗雜的東西,速度快,功能齊全,個人推薦使用。
PyCharm:主要針對於python開發的IDE,所以項目開發也推薦使用。
⑶ 源碼編輯器如何做轉盤
1、繪制橢圓,調整選項欄參數。
2、Alt加F8打開變換泊塢窗的旋轉,調整中心點位置、旋轉角度、數量,點擊應用按鈕,做復制的圖形。
3、選中其中的一個圖形,按數字鍵盤加號,復制圖形,修改選項欄參數,並按Shift加PageDown,移至最下層,並填充漸變色。
4、Shift選擇橢圓做成的餅形圖分別改變顏色為黃色和白色,輪廓無顏色。
5、選擇最下層的圓形,按數字鍵盤加號復制,調整大小,並填充顏色。
6、復制圓形,改為紅色,用多邊形工具畫出三角形。
7、再次復制圓形,填充色為白色,放在最上方,用文字工具輸入文字,左單擊顏色調板的紅色,改變文字顏色,並調整位置和大小。
8、選擇橢圓工具按Ctrl鍵畫正圓形,調整好位置,填充漸變色。
9、選擇工具單擊選擇正圓形,再次點擊,調整中心點位置到大圓形的中心點,打開變換泊塢窗,調整參數,點擊應用。
10、旋轉並復制其他的漸變色小圓做裝飾。以上是源碼編輯器如何做轉盤的方法。