bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

自制java源代碼編輯器 源碼編輯器使用教程

用java設(shè)計(jì)一個(gè) 文本編輯器

是編譯器吧............要不研究下Eclipse的源碼?

專(zhuān)注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)閬中免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

首先分析java的關(guān)鍵字。最主要的幾個(gè):

package,import,class,private,public,protected關(guān)鍵字。

第一步:把java程序讀進(jìn)內(nèi)存

第二步:去掉行注釋?zhuān)喊葱凶x取,如果這行是“//”開(kāi)頭的就從文件中刪除

第三步:去掉塊注釋?zhuān)喊醋址x取,如果遇到“/*”字符,就開(kāi)始刪除直到遇到第一個(gè)“*/”為止。

第四步:建一個(gè)方法Public String getPackage():按行讀入,如果這行是package開(kāi)頭的就把package后面直到“;”之前的內(nèi)容讀出。

第五步:建一個(gè)方法Public List getImport():按行讀入,如果這行是import開(kāi)頭的就把package后面直到“;”之前的內(nèi)容讀出。

第六步:建一個(gè)枚舉類(lèi)型accessKey,存放private,public,protected關(guān)鍵字

第七步:建一個(gè)方法Public List getPropertise():按行讀入,如果這行是accessKey開(kāi)頭的并且這行有“;”,而沒(méi)有“(”,說(shuō)明這是Propertise。

第八步:建一個(gè)方法Public String getMethodByName(String methodName):按行讀入,如果這行是accessKey開(kāi)頭的并且這行有“(”,說(shuō)明這是method,就把這行至到下一個(gè)accessKey的所有內(nèi)容輸出。

但是這個(gè)方法沒(méi)考慮接口和虛類(lèi),內(nèi)部類(lèi),等等問(wèn)題。

java源代碼編輯器 設(shè)計(jì)用于編寫(xiě)Java源代碼的編輯器,基本要求:可以完成源程序的文件打開(kāi),編輯和文件保存

一. 高亮的內(nèi)容:

需要高亮的內(nèi)容有:

1. 關(guān)鍵字, 如 public, int, true 等.

2. 運(yùn)算符, 如 +, -, *, /等

3. 數(shù)字

4. 高亮字符串, 如 "example of string"

5. 高亮單行注釋

6. 高亮多行注釋

二. 實(shí)現(xiàn)高亮的核心方法:

StyledDocument.setCharacterAttributes(int offset, int length, AttributeSet s, boolean replace)

三. 文本編輯器選擇.

Java中提供的多行文本編輯器有: JTextComponent, JTextArea, JTextPane, JEditorPane等, 都可以使用. 但是因?yàn)檎Z(yǔ)法著色中文本要使用多種風(fēng)格的樣式, 所以這些文本編輯器的document要使用StyledDocument.

JTextArea使用的是PlainDocument, 此document不能進(jìn)行多種格式的著色.

JTextPane, JEditorPane使用的是StyledDocument, 默認(rèn)就可以使用.

為了實(shí)現(xiàn)語(yǔ)法著色, 可以繼承自DefaultStyledDocument, 設(shè)置其為這些文本編輯器的documet, 或者也可以直接使用JTextPane, JEditorPane來(lái)做. 為了方便, 這里就直接使用JTextPane了.

四. 何時(shí)進(jìn)行著色.

當(dāng)文本編輯器中有字符被插入或者刪除時(shí), 文本的內(nèi)容就發(fā)生了變化, 這時(shí)檢查, 進(jìn)行著色.

為了監(jiān)視到文本的內(nèi)容發(fā)生了變化, 要給document添加一個(gè)DocumentListener監(jiān)聽(tīng)器, 在他的removeUpdate和insertUpdate中進(jìn)行著色處理.

而changedUpdate方法在文本的屬性例如前景色, 背景色, 字體等風(fēng)格改變時(shí)才會(huì)被調(diào)用.

@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 {

// 因?yàn)閯h除后光標(biāo)緊接著影響的單詞兩邊, 所以長(zhǎng)度就不需要了

colouring((StyledDocument) e.getDocument(), e.getOffset(), 0);

} catch (BadLocationException e1) {

e1.printStackTrace();

}

}

五. 著色范圍:

pos: 指變化前光標(biāo)的位置.

len: 指變化的字符數(shù).

例如有關(guān)鍵字public, int

單詞"publicint", 在"public"和"int"中插入一個(gè)空格后變成"public int", 一個(gè)單詞變成了兩個(gè), 這時(shí)對(duì)"public" 和 "int"進(jìn)行著色.

著色范圍是public中p的位置和int中t的位置加1, 即是pos前面單詞開(kāi)始的下標(biāo)和pos+len開(kāi)始單詞結(jié)束的下標(biāo). 所以上例中要著色的范圍是"public int".

提供了方法indexOfWordStart來(lái)取得pos前單詞開(kāi)始的下標(biāo), 方法indexOfWordEnd來(lái)取得pos后單詞結(jié)束的下標(biāo).

public int indexOfWordStart(Document doc, int pos) throws BadLocationException {

// 從pos開(kāi)始向前找到第一個(gè)非單詞字符.

for (; pos 0 isWordCharacter(doc, pos - 1); --pos);

return pos;

}

public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {

// 從pos開(kāi)始向前找到第一個(gè)非單詞字符.

for (; isWordCharacter(doc, pos); ++pos);

return pos;

}

一個(gè)字符是單詞的有效字符: 是字母, 數(shù)字, 下劃線.

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);

六. 關(guān)鍵字著色.

從著色范圍的開(kāi)始下標(biāo)起進(jìn)行判斷, 如果是以字母開(kāi)或者下劃線開(kāi)頭, 則說(shuō)明是單詞, 那么先取得這個(gè)單詞, 如果這個(gè)單詞是關(guān)鍵字, 就進(jìn)行關(guān)鍵字著色, 如果不是, 就進(jìn)行普通的著色. 著色完這個(gè)單詞后, 繼續(xù)后面的著色處理. 已經(jīng)著色過(guò)的字符, 就不再進(jìn)行著色了.

public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {

// 取得插入或者刪除后影響到的單詞.

// 例如"public"在b后插入一個(gè)空格, 就變成了:"pub lic", 這時(shí)就有兩個(gè)單詞要處理:"pub"和"lic"

// 這時(shí)要取得的范圍是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 == '_') {

// 如果是以字母或者下劃線開(kāi)頭, 說(shuō)明是單詞

// pos為處理后的最后一個(gè)下標(biāo)

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); // 要進(jìn)行著色的單詞

if (keywords.contains(word)) {

// 如果是關(guān)鍵字, 就進(jìn)行關(guān)鍵字的著色, 否則使用普通的著色.

// 這里有一點(diǎn)要注意, 在insertUpdate和removeUpdate的方法調(diào)用的過(guò)程中, 不能修改doc的屬性.

// 但我們又要達(dá)到能夠修改doc的屬性, 所以把此任務(wù)放到這個(gè)方法的外面去執(zhí)行.

// 實(shí)現(xiàn)這一目的, 可以使用新線程, 但放到swing的事件隊(duì)列里去處理更輕便一點(diǎn).

SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));

} else {

SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));

}

return wordEnd;

}

因?yàn)樵趇nsertUpdate和removeUpdate方法中不能修改document的屬性, 所以著色的任務(wù)放到這兩個(gè)方法外面, 所以使用了SwingUtilities.invokeLater來(lái)實(shí)現(xiàn).

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 {

// 這里就是對(duì)字符進(jìn)行著色

doc.setCharacterAttributes(pos, len, style, true);

} catch (Exception e) {}

}

}

七: 源碼

關(guān)鍵字著色的完成代碼如下, 可以直接編譯運(yùn)行. 對(duì)于數(shù)字, 運(yùn)算符, 字符串等的著色處理在以后的教程中會(huì)繼續(xù)進(jìn)行詳解.

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);

}

}

/**

* 當(dāng)文本輸入?yún)^(qū)的有字符插入或者刪除時(shí), 進(jìn)行高亮.

*

* 要進(jìn)行語(yǔ)法高亮, 文本輸入組件的document要是styled document才行. 所以不要用JTextArea. 可以使用JTextPane.

*

* @author Biao

*

*/

class SyntaxHighlighter implements DocumentListener {

private SetString keywords;

private Style keywordStyle;

private Style normalStyle;

public SyntaxHighlighter(JTextPane editor) {

// 準(zhǔn)備著色使用的樣式

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);

// 準(zhǔn)備關(guān)鍵字

keywords = new HashSetString();

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后插入一個(gè)空格, 就變成了:"pub lic", 這時(shí)就有兩個(gè)單詞要處理:"pub"和"lic"

// 這時(shí)要取得的范圍是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 == '_') {

// 如果是以字母或者下劃線開(kāi)頭, 說(shuō)明是單詞

// pos為處理后的最后一個(gè)下標(biāo)

start = colouringWord(doc, start);

} else {

SwingUtilities.invokeLater(new ColouringTask(doc, start, 1, normalStyle));

++start;

}

}

}

/**

* 對(duì)單詞進(jìn)行著色, 并返回單詞結(jié)束的下標(biāo).

*

* @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)) {

// 如果是關(guān)鍵字, 就進(jìn)行關(guān)鍵字的著色, 否則使用普通的著色.

// 這里有一點(diǎn)要注意, 在insertUpdate和removeUpdate的方法調(diào)用的過(guò)程中, 不能修改doc的屬性.

// 但我們又要達(dá)到能夠修改doc的屬性, 所以把此任務(wù)放到這個(gè)方法的外面去執(zhí)行.

// 實(shí)現(xiàn)這一目的, 可以使用新線程, 但放到swing的事件隊(duì)列里去處理更輕便一點(diǎn).

SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, keywordStyle));

} else {

SwingUtilities.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));

}

return wordEnd;

}

/**

* 取得在文檔中下標(biāo)在pos處的字符.

*

* 如果pos為doc.getLength(), 返回的是一個(gè)文檔的結(jié)束符, 不會(huì)拋出異常. 如果pos0, 則會(huì)拋出異常.

* 所以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);

}

/**

* 取得下標(biāo)為pos時(shí), 它所在的單詞開(kāi)始的下標(biāo). ?±wor^d?± (^表示pos, ?±表示開(kāi)始或結(jié)束的下標(biāo))

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public int indexOfWordStart(Document doc, int pos) throws BadLocationException {

// 從pos開(kāi)始向前找到第一個(gè)非單詞字符.

for (; pos 0 isWordCharacter(doc, pos - 1); --pos);

return pos;

}

/**

* 取得下標(biāo)為pos時(shí), 它所在的單詞結(jié)束的下標(biāo). ?±wor^d?± (^表示pos, ?±表示開(kāi)始或結(jié)束的下標(biāo))

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {

// 從pos開(kāi)始向前找到第一個(gè)非單詞字符.

for (; isWordCharacter(doc, pos); ++pos);

return pos;

}

/**

* 如果一個(gè)字符是字母, 數(shù)字, 下劃線, 則返回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 {

// 因?yàn)閯h除后光標(biāo)緊接著影響的單詞兩邊, 所以長(zhǎng)度就不需要了

colouring((StyledDocument) e.getDocument(), e.getOffset(), 0);

} catch (BadLocationException e1) {

e1.printStackTrace();

}

}

/**

* 完成著色任務(wù)

*

* @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 {

// 這里就是對(duì)字符進(jìn)行著色

doc.setCharacterAttributes(pos, len, style, true);

} catch (Exception e) {}

}

}

}

如何用java編寫(xiě)一個(gè)簡(jiǎn)單的文本編輯器?

import java.awt.*;\x0d\x0aimport java.awt.event.*;\x0d\x0aimport javax.swing.*;\x0d\x0aimport java.io.*;\x0d\x0a\x0d\x0apublic class f1 extends Frame implements ActionListener\x0d\x0a{\x0d\x0aprivate MenuBar menubar=new MenuBar();\x0d\x0aprivate Menu filemenu=new Menu("文件");\x0d\x0aprivate Menu editmenu=new Menu("編輯");\x0d\x0aprivate Menu formmenu=new Menu("格式");\x0d\x0aprivate MenuItem[] itemf=new MenuItem[4];\x0d\x0aprivate MenuItem[] iteme=new MenuItem[6];\x0d\x0aprivate MenuItem[] items=new MenuItem[2];\x0d\x0aprivate TextArea tf=new TextArea();\x0d\x0a\x0d\x0apublic int a=0,b=0,c=0,style=Font.PLAIN,size=15;\x0d\x0apublic String s1="red:"+a+" "+"green:"+b+" "+"blue"+c,\x0d\x0as2="宋體";\x0d\x0a\x0d\x0apublic String[] sz1={"10","16","24","30","32","36"},\x0d\x0asz2={"宋體","黑體","幼圓","隸書(shū)","行楷","Arial","Georgia"},\x0d\x0asz3={"粗體","傾斜","常規(guī)","粗斜"};\x0d\x0a\x0d\x0aJDialog dialog=new JDialog(this,"字體",true);\x0d\x0aContainer cp=dialog.getContentPane();\x0d\x0aJLabel[] lb=new JLabel[8]; \x0d\x0aJLabel lb1=new JLabel(s1,JLabel.LEFT);\x0d\x0aJButton b1=new JButton("確定"),\x0d\x0ab2=new JButton("取消");\x0d\x0aJComboBox jc1=new JComboBox(),\x0d\x0ajc2=new JComboBox(),\x0d\x0ajc3=new JComboBox();\x0d\x0aJScrollBar jb1=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);\x0d\x0aJScrollBar jb2=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);\x0d\x0aJScrollBar jb3=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);

文章標(biāo)題:自制java源代碼編輯器 源碼編輯器使用教程
網(wǎng)站URL:http://vcdvsql.cn/article30/hehhso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航虛擬主機(jī)做網(wǎng)站定制開(kāi)發(fā)網(wǎng)站設(shè)計(jì)公司電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司