常見的十四種Java開發(fā)工具的特點(diǎn)
成都創(chuàng)新互聯(lián)專注于平順網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供平順營(yíng)銷型網(wǎng)站建設(shè),平順網(wǎng)站制作、平順網(wǎng)頁設(shè)計(jì)、平順網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造平順網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供平順網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
1、JDK(JavaDevelopmentKit)Java開發(fā)工具集
從初學(xué)者角度來看,采用JDK開發(fā)Java程序能夠很快理解程序中各部分代碼之間的關(guān)系,有利于理解Java面向?qū)ο蟮脑O(shè)計(jì)思想。JDK的另一個(gè)顯著特點(diǎn)是隨著Java(J2EE、J2SE以及J2ME)版本的升級(jí)而升級(jí)。但它的缺點(diǎn)也是非常明顯的就是從事大規(guī)模企業(yè)級(jí)Java應(yīng)用開發(fā)非常困難,不能進(jìn)行復(fù)雜的Java軟件開發(fā),也不利于團(tuán)體協(xié)同開發(fā)。
2、JavaWorkshop
3、NetBeans與SunJavaStudio5
NetBeans是開放源碼的Java集成開發(fā)環(huán)境(IDE),適用于各種客戶機(jī)和Web應(yīng)用。
SunJavaStudio是Sun公司最新發(fā)布的商用全功能JavaIDE,支持Solaris、Linux和Windows平臺(tái),適于創(chuàng)建和部署2層JavaWeb應(yīng)用和n層J2EE應(yīng)用的企業(yè)開發(fā)人員使用。NetBeans是業(yè)界第一款支持創(chuàng)新型Java開發(fā)的開放源碼IDE。開發(fā)人員可以利用業(yè)界強(qiáng)大的開發(fā)工具來構(gòu)建桌面、Web或移動(dòng)應(yīng)用。同時(shí),通過NetBeans和開放的API的模塊化結(jié)構(gòu),第三方能夠非常輕松地?cái)U(kuò)展或集成NetBeans平臺(tái)。NetBeans3.5.1主要針對(duì)一般Java軟件的開發(fā)者,而JavaOneStudio5則主要針對(duì)企業(yè)做網(wǎng)絡(luò)服務(wù)等應(yīng)用的開發(fā)者。Sun不久還將推出ProjectRave,其目標(biāo)是幫助企業(yè)的開發(fā)者進(jìn)行軟件開發(fā)。NetBeans3.5.1版本與其他開發(fā)工具相比,最大區(qū)別在于不僅能夠開發(fā)各種臺(tái)式機(jī)上的應(yīng)用,而且可以用來開發(fā)網(wǎng)絡(luò)服務(wù)方面的應(yīng)用,可以開發(fā)基于J2ME的移動(dòng)設(shè)備上的應(yīng)用等。在NetBeans3.5.1基礎(chǔ)上,Sun開發(fā)出了JavaOneStudio5,為用戶提供了一個(gè)更加先進(jìn)的企業(yè)編程環(huán)境。在新的JavaOneStudio5里有一個(gè)應(yīng)用框架,開發(fā)者可以利用這些模塊快速開發(fā)自己在網(wǎng)絡(luò)服務(wù)方面的各種應(yīng)用程序。
4、Borland的JBuilder
Jbuilder進(jìn)入了Java集成開發(fā)環(huán)境的王國(guó),它滿足很多方面的應(yīng)用,尤其是對(duì)于服務(wù)器方以及EJB開發(fā)者們來說。下面簡(jiǎn)單介紹一下Jbuilder的特點(diǎn):
1)Jbuilder支持最新的Java技術(shù),包括Applets、JSP/Servlets、JavaBean以及EJB(EnterpriseJavaBeans)的應(yīng)用。
2)用戶可以自動(dòng)地生成基于后端數(shù)據(jù)庫表的EJBJava類,Jbuilder同時(shí)還簡(jiǎn)化了EJB的自動(dòng)部署功能.此外它還支持CORBA,相應(yīng)的向?qū)С绦蛴兄谟脩羧娴毓芾鞩DL(分布應(yīng)用程序所必需的接口定義語言InterfaceDefinitionLanguage)和控制遠(yuǎn)程對(duì)象。
3)Jbuilder支持各種應(yīng)用服務(wù)器。Jbuilder與InpriseApplicationServer緊密集成,同時(shí)支持WebLogicServer,支持EJB1.1和EJB2.0,可以快速開發(fā)J2EE的電子商務(wù)應(yīng)用。
4)Jbuilder能用Servlet和JSP開發(fā)和調(diào)試動(dòng)態(tài)Web應(yīng)用。
5)利用Jbuilder可創(chuàng)建(沒有專有代碼和標(biāo)記)純Java2應(yīng)用。由于Jbuilder是用純Java語言編寫的,其代碼不含任何專屬代碼和標(biāo)記,它支持最新的Java標(biāo)準(zhǔn)。
6)Jbuilder擁有專業(yè)化的圖形調(diào)試介面,支持遠(yuǎn)程調(diào)試和多線程調(diào)試,調(diào)試器支持各種JDK版本,包括J2ME/J2SE/J2EE。JBuilder環(huán)境開發(fā)程序方便,它是純的Java開發(fā)環(huán)境,適合企業(yè)的J2EE開發(fā);缺點(diǎn)是往往一開始人們難于把握整個(gè)程序各部分之間的關(guān)系,對(duì)機(jī)器的硬件要求較高,比較吃內(nèi)存,這時(shí)運(yùn)行速度顯得較慢。
5、Oracle的JDeveloper
Oracle9iJDeveloper(定為9.0版,最新為10g)為構(gòu)建具有J2EE功能,XML和Webservices的復(fù)雜的,多層的Java應(yīng)用程序提供了一個(gè)完全集成的開發(fā)環(huán)境。它為運(yùn)用Oracle9i數(shù)據(jù)庫和應(yīng)用服務(wù)器的開發(fā)人員提供特殊的功能和增強(qiáng)性能,除此以外,它也有資格成為用于多種用途Java開發(fā)的一個(gè)強(qiáng)大的工具。
Oracle9iJDeveloper的主要特點(diǎn)如下:
①具有UML(UnifiedModelingLanguage,一體化建模語言)建模功能。可以將業(yè)務(wù)對(duì)象及e-business應(yīng)用模型化。
②配備有高速Java調(diào)試器(Debuger)、內(nèi)置Profiling工具、提高代碼質(zhì)量的工具“CodeCoach”等。
③支持SOAP(SimpleObjectAccessProtocol)“簡(jiǎn)單對(duì)象訪問協(xié)議”、UDDI(UniversalDescription,DiscoveryandIntegration)“統(tǒng)一描述、發(fā)現(xiàn)和集成協(xié)議”
、WSDL(WebServicesDescriptionLanguage)“WEB服務(wù)描述語言”等Web服務(wù)標(biāo)準(zhǔn)。JDeveloper不僅僅是很好的Java編程工具,而且是OracleWeb服務(wù)的延伸,支持ApacheSOAP,以及9iAS,可擴(kuò)充的環(huán)境和XML和WSDL語言緊密相關(guān)。Oracle9iJdeveloper完全利用Java編寫,能夠與以前的Oracle服務(wù)器軟件以及其他廠商支持J2EE的應(yīng)用服務(wù)器產(chǎn)品相兼容,而且在設(shè)計(jì)時(shí)著重針對(duì)Oracle9i,能夠無縫化跨平臺(tái)之間的應(yīng)用開發(fā),提供了業(yè)界第一個(gè)完整的、集成了J2EE和XML的開發(fā)環(huán)境,允許開發(fā)者快速開發(fā)可以通過Web、無線設(shè)備及語音界面訪問的Web服務(wù)和交易應(yīng)用,以往只能通過將傳統(tǒng)Java編程技巧與最新模塊化方式結(jié)合到一個(gè)單一集成的開發(fā)環(huán)境中之后才能完成J2EE應(yīng)用開發(fā)生命周期管理的事實(shí),從根本上得到改變。缺點(diǎn)就是對(duì)于初學(xué)者來說,較復(fù)雜,也比較難。
6、IBM的VisualAgeforJava
VisualAgeforJava是一個(gè)非常成熟的開發(fā)工具,它的特性以于IT開發(fā)者和業(yè)余的Java編程人員來說都是非常用有用的。它提供對(duì)可視化編程的廣泛支持,支持利用CICS連接遺傳大型機(jī)應(yīng)用,支持EJB的開發(fā)應(yīng)用,支持與Websphere的集成開發(fā),方便的bean創(chuàng)建和良好的快速應(yīng)用開發(fā)(RAD)支持和無文件式的文件處理。
IBM為建設(shè)Web站點(diǎn)所推出的WebSphereStudioAdvancedEdition及其包含的Visual
AgeforJavaProfessionalEdition軟件已全面轉(zhuǎn)向以Java為中心,這樣,Java開發(fā)人員對(duì)WebSphere全套工具的感覺或許會(huì)好了許多。Studio所提供的工具有:Web站點(diǎn)管理、快速開發(fā)JDBC頁向?qū)С绦?、HTML編輯器和HTML語法檢查等。這確實(shí)是個(gè)不錯(cuò)的HTML站點(diǎn)頁面編輯環(huán)境。Studio和VisualAge集成度很高,菜單中提供了在兩種軟件包之間快速移動(dòng)代碼的選項(xiàng)。這就讓使用Studio的Web頁面設(shè)計(jì)人員和使用VisualAge的Java程序員
可以相互交換文件、協(xié)同工作。VisualAgeforJava支持團(tuán)隊(duì)開發(fā),內(nèi)置的代碼庫可以自動(dòng)地根據(jù)用戶做出改動(dòng)而修改程序代碼,這樣就可以很方便地將目前代碼和早期版本做出比較。與VisualAge緊密結(jié)合的WebsphereStudio本身并不提供源代碼和版本管理的支持,它只是包含了一個(gè)內(nèi)置文件鎖定系統(tǒng),當(dāng)編輯項(xiàng)目的時(shí)候可以防止其他人對(duì)這些文件的錯(cuò)誤修改,軟件還支持諸如MicrosoftVisualSourceSafe這樣的第三方源代碼控制系統(tǒng)。VisualAgeforJava完全面向?qū)ο蟮某绦蛟O(shè)計(jì)思想使得開發(fā)程序非??焖佟⒏咝АD憧梢圆痪帉懭魏未a就可以設(shè)計(jì)出一個(gè)典型的應(yīng)用程序框架。VisualAgeforJava作為IBM電子商務(wù)解決方案其中產(chǎn)品之一,可以無縫地與其他IBM產(chǎn)品,如WebSphere、DB2融合,迅速完成從設(shè)計(jì)、開發(fā)到部署應(yīng)用的整個(gè)過程。VisualAgeforJava獨(dú)特的管理文件方式使其集成外部工具非常困難,你無法讓VisualAgeforJava與其他工具一起聯(lián)合開發(fā)應(yīng)用。
7、BEA的WebLogicWorkshop
BEAWebLogicWorkshop是一個(gè)統(tǒng)一、簡(jiǎn)化、可擴(kuò)展的開發(fā)環(huán)境,使所有的開發(fā)人員都能在BEAWebLogicEnterprisePlatform之上構(gòu)建基于標(biāo)準(zhǔn)的企業(yè)級(jí)應(yīng)用,從而提高了開發(fā)部門的生產(chǎn)力水平,加快了價(jià)值的實(shí)現(xiàn)。WebLogicWorkshop除了提供便捷的Web服務(wù)之外,它能夠用于創(chuàng)建更多種類的應(yīng)用。作為整個(gè)BEAWebLogicPlatform的開發(fā)環(huán)境。不管是創(chuàng)建門戶應(yīng)用、編寫工作流、還是創(chuàng)建Web應(yīng)用,Workshop8.1都可以幫助開發(fā)人員更快更好地完成。WebLogicWorkshop的主要特點(diǎn)如下:
①使J2EE開發(fā)切實(shí)可行,提高開發(fā)效率
BEAWebLogicWorkshop使開發(fā)人員遠(yuǎn)離J2EE內(nèi)在的復(fù)雜性,集中精力專注業(yè)務(wù)邏輯,無須操心單調(diào)乏味的基礎(chǔ)結(jié)構(gòu)代碼。這種創(chuàng)新意味著,已被企業(yè)驗(yàn)證的J2EE的強(qiáng)大功能,最終被大多數(shù)不熟悉Java和J2EE的應(yīng)用開發(fā)人員所掌握,從而使IT部門的工作效率提高一個(gè)數(shù)量級(jí)??梢暬O(shè)計(jì)器以及直觀的概念,如事件、屬性和控件等,實(shí)現(xiàn)了基于事件的開發(fā)。Workshop簡(jiǎn)化的程序設(shè)計(jì)模型,使開發(fā)人員不必掌握復(fù)雜的J2EEAPI和面向?qū)ο蟮某绦蛟O(shè)計(jì)原理。所有開發(fā)人員,包括J2EE專家和具有可視化和過程化語言技能的應(yīng)用開發(fā)人員在內(nèi),都可以共同工作在BEAWebLogicEnterprisePlatform之上。Workshop的可視化開發(fā)環(huán)境,創(chuàng)建帶有代碼注釋的標(biāo)準(zhǔn)Java文件,用來說明由運(yùn)行時(shí)框架實(shí)施的企業(yè)級(jí)需求。J2EE和其他高級(jí)開發(fā)人員,借助功能強(qiáng)大的代碼編輯功能,可以訪問Java源代碼,從而彌補(bǔ)了可視化設(shè)計(jì)器的不足。
②構(gòu)建企業(yè)級(jí)應(yīng)用
通過在可伸縮、安全可靠的企業(yè)級(jí)架構(gòu)上實(shí)施各種應(yīng)用,BEAWebLogicWorkshop大大降低了開發(fā)風(fēng)險(xiǎn)。而且,所有應(yīng)用的創(chuàng)建都使用標(biāo)準(zhǔn)的J2EE組件,既保護(hù)了您的技術(shù)投資,又保持了最大的靈活性。BEAWebLogicWorkshop運(yùn)行框架,是統(tǒng)一整個(gè)架構(gòu)的匯聚層,使單一、簡(jiǎn)化的程序設(shè)計(jì)模型擴(kuò)展到所有的BEAWebLogicEnterprisePlatform應(yīng)用類型。通過解釋設(shè)計(jì)時(shí)創(chuàng)建的注釋代碼,運(yùn)行時(shí)框架可以實(shí)現(xiàn)必要的J2EE組件,并且提取出與J2EE應(yīng)用開發(fā)有關(guān)的所有底層細(xì)節(jié)。
③降低IT復(fù)雜性BEAWebLogicWorkshop提供各種Java控件,使得與IT資源的連接更輕而易舉。另外,在構(gòu)建任何BEAWebLogicPlatform的應(yīng)用中,Java控件不僅可擴(kuò)展而且完全相同。這種強(qiáng)大、有效的方法能夠:降低IT技術(shù)的復(fù)雜性,優(yōu)化信息的可用性,推動(dòng)包含"最佳業(yè)務(wù)方案"的可重用服務(wù)的開發(fā),使開發(fā)人員能以更低的成本、更短的時(shí)間實(shí)現(xiàn)更大的產(chǎn)出。
利用BEAWebLogicWorkshop,任何開發(fā)人員都能以最大的生產(chǎn)效率,構(gòu)建各種Web服務(wù)、Web應(yīng)用、門戶和集成項(xiàng)目。BEAWebLogicWorkshop是BEA的產(chǎn)品戰(zhàn)略核心,它幫助客戶接觸和利用面向服務(wù)架構(gòu)(SOA)的強(qiáng)大功能。BEAWeblogicWorkshop8.1極大簡(jiǎn)化了當(dāng)前實(shí)際企業(yè)集成環(huán)境中企業(yè)級(jí)應(yīng)用和服務(wù)的構(gòu)建,并成為全面支持關(guān)鍵企業(yè)級(jí)應(yīng)用(如異步、真正松耦合和粗粒度消息傳送等)的自然選擇。它的缺點(diǎn)就是過于復(fù)雜,對(duì)于初學(xué)者來說,理解起來較為困難。
8、WebGain的VisualCafeforJavaVisualCafe是只能在Symantec公司的Java虛擬機(jī)、Netscape公司的Java虛擬機(jī)和Microsoft虛擬機(jī)上工作的調(diào)試器。這對(duì)于開發(fā)者來講是一個(gè)重要的特性,因?yàn)橛脩糸_發(fā)的Java代碼中的許多軟件bug就可能中會(huì)在某種特定的虛擬機(jī)上起作用。在修改后進(jìn)行編譯基繼續(xù)進(jìn)行調(diào)試時(shí),VisualCafe會(huì)自動(dòng)將文件存盤,使用VisualCafe創(chuàng)建的原生應(yīng)用具有許多特點(diǎn)。除了明顯的速度提高之外,Symantec使類庫的二進(jìn)制方式比正常的JDK小VisualCafe為所指定的關(guān)系自動(dòng)生成或更新必要的Java代碼。利用VisualCafe,用戶可以從一個(gè)標(biāo)準(zhǔn)對(duì)象數(shù)據(jù)庫中集合完整的Java應(yīng)用程序和Applet,而不必再編寫源代碼。VisualCafe還提供了一個(gè)擴(kuò)充的源代碼開發(fā)工具集。VisualCafe綜合了Java軟件的可視化源程序開發(fā)工具,它允許開發(fā)人員在可視化視圖和源視圖之間進(jìn)行有效地轉(zhuǎn)換。在可視化視圖中進(jìn)行的修改立即反映在源代碼中。對(duì)源代碼的改變自動(dòng)更新可視化視圖。VisualCafe具有許多源文件方面的特性,如全局檢索和替換。絕大多數(shù)Java開發(fā)工具的文獻(xiàn)的問題在于簡(jiǎn)單地挨個(gè)介紹開發(fā)工具的每部分組件,但用戶在開應(yīng)用時(shí)還需要一個(gè)面向任務(wù)的手冊(cè),利用這個(gè)手冊(cè)你可以不必知道工具每一部分的特定功能就可以開始創(chuàng)建自己的應(yīng)用。VisualCafe提供了非常全面的用戶指南,它對(duì)最開始的安裝到創(chuàng)建第一個(gè)Java應(yīng)用和Applet都提供了全面的幫助,VisualCafe將自動(dòng)生成所指明關(guān)系的必要Java代碼。VisualCafe可以在Windows95和WindowsNT平臺(tái)下運(yùn)行,Symantec公司為Java開發(fā)工作提供一個(gè)在Macintosh操作系統(tǒng)下可以運(yùn)行的RAD工具。VisualCafe編譯器速度很快,在國(guó)際化支持方面比較突出;缺點(diǎn)就是對(duì)于初學(xué)者來說,較復(fù)雜,也比較難。
9、Macromedia的JRUN
Macromedia公司的JRun是一個(gè)具有最廣闊適用性的Java引擎,用于開發(fā)及實(shí)施由JavaServlets和JavaServerPages編寫的服務(wù)器端Java應(yīng)用。JRun是第一個(gè)完全支持JSP1.0規(guī)格書的商業(yè)化產(chǎn)品,全球有超過80,000名開發(fā)人員使用JRun在他們已有的Web服務(wù)器上添加服務(wù)器端Java的功能。其中Web服務(wù)器包括了MicrosoftIIS,NetscapeEnterpriseServer,Apache等。JRun是開發(fā)實(shí)施服務(wù)器端Java的先進(jìn)引擎。如果我們希望在我們的Web應(yīng)用中添加服務(wù)器端Java功能,那么JRun將成為我們的正確選擇。JRun目前有3個(gè)版本,它是第一個(gè)支持JavaServerPages(JSP)規(guī)格書1.0的商業(yè)化產(chǎn)品。JSP是一種強(qiáng)大的服務(wù)器端技術(shù),它是用于創(chuàng)建復(fù)雜Web應(yīng)用的一整套快速應(yīng)用開發(fā)系統(tǒng)。JRun可以使我們開始開發(fā)并測(cè)試Java應(yīng)用。它最多接受5個(gè)并發(fā)的連接并且包括全部JavaServletAPI,支持JavaServerPages(JSP),支持所有主要的Webservers和計(jì)算機(jī)平臺(tái)。JRunPro能夠在生產(chǎn)環(huán)境下承受大訪問量的負(fù)載,幫助我們實(shí)施應(yīng)用、服務(wù)或Web站點(diǎn)(包括內(nèi)聯(lián)網(wǎng))。JRunPro支持無限量并發(fā)式連接運(yùn)行多個(gè)Java虛擬機(jī),包括多個(gè)并發(fā)的Java虛擬機(jī)(JVM)。提供一個(gè)遠(yuǎn)程管理applet以及一個(gè)遠(yuǎn)程可再分布式的管理applet。JRunProUnlimited包括了所有JRunPro的功能,除次以外,還可以運(yùn)行無限量的,并發(fā)的JVM。JRun依靠其內(nèi)置的JRunWebServer可以單獨(dú)運(yùn)行。使用服務(wù)器端Java,用戶可以開發(fā)出復(fù)雜的商業(yè)應(yīng)用系統(tǒng)。最重要的一點(diǎn)是,由于servlets的平臺(tái)獨(dú)立性,以及更加簡(jiǎn)單的開發(fā)、更快速的實(shí)施、更經(jīng)濟(jì)的維護(hù)成本,它是CGI(CommonGatewayInterface)或Perlscripts的極佳的替代產(chǎn)品。缺點(diǎn)就是對(duì)于初學(xué)者來說,較復(fù)雜,也比較難。10、JCreator
JCreator是一個(gè)Java程序開發(fā)工具,也是一個(gè)Java集成開發(fā)環(huán)境(IDE)。無論你是要開發(fā)Java應(yīng)用程序或者網(wǎng)頁上的Applet元件都難不倒它。在功能上與Sun公司所公布的JDK等文字模式開發(fā)工具相較之下來得容易,還允許使用者自訂義操作窗口界面及無限Undo/Redo等功能。JCreator為用戶提供了相當(dāng)強(qiáng)大的功能,例如項(xiàng)目管理功能,項(xiàng)目模板功能,可個(gè)性化設(shè)置語法高亮屬性、行數(shù)、類瀏覽器、標(biāo)簽文檔、多功能編繹器,向?qū)Чδ芤约巴耆勺远x的用戶界面。通過JCreator,我們不用激活主文檔而直接編繹或運(yùn)行我們的JAVA程序。JCreator能自動(dòng)找到包含主函數(shù)的文件或包含Applet的Html文件,然后它會(huì)運(yùn)行適當(dāng)?shù)墓ぞ?。在JCreator中,我們可以通過一個(gè)批處理同時(shí)編繹多個(gè)項(xiàng)目。JCreator的設(shè)計(jì)接近Windows界面風(fēng)格,用戶對(duì)它的界面比較熟悉。其最大特點(diǎn)是與我們機(jī)器中所裝的JDK完美結(jié)合,是其它任何一款I(lǐng)DE所不能比擬的。它是一種初學(xué)者很容易上手的java開發(fā)工具,缺點(diǎn)是只能進(jìn)行簡(jiǎn)單的程序開發(fā),不能進(jìn)行企業(yè)J2EE的開發(fā)應(yīng)用。
11、MicrosoftVJ++
VisualJ++是Microsoft公司推出的可視化的Java語言集成開發(fā)環(huán)境(IDE),為Java編程人員提供了一個(gè)新的開發(fā)環(huán)境,是一個(gè)相當(dāng)出色的開發(fā)工具。無論集成性、編譯速度、調(diào)試功能、還是易學(xué)易用性,都體現(xiàn)了Microsoft的一慣風(fēng)格。VisualJ++具有
下面的特點(diǎn):
1)VisualJ++把Java虛擬機(jī)(JVM)作為獨(dú)立的操作系統(tǒng)組件放入Windows,使之從瀏覽器中獨(dú)立出來。
2)Microsoft的應(yīng)用基本類庫(AFC,ApplicationFoundationClassLibrary)對(duì)SUN公司的JDK作了擴(kuò)展,使應(yīng)用基本類庫更加適合在Windows下使用。
3)VisualJ++的調(diào)試器支持動(dòng)態(tài)調(diào)試,包括單步執(zhí)行、設(shè)置斷點(diǎn)、觀察變量數(shù)值等。
4)VisualJ++提供了一些程序向?qū)?Wizards)和生成器(Builders),它們可以方便地幫助用戶快速地生成Java程序,幫助你在自己的工程中創(chuàng)建和修改文件。
5)VisualJ++界面友好,其代碼編輯器具有智能感知、聯(lián)機(jī)編譯等功能,使程序編寫十分方便。VisualJ++中建立了Java的WFC,這一新的應(yīng)用程序框架能夠直接訪問Windows應(yīng)用程序接口(API),使你能夠用Java語言編寫完全意義上的Windows應(yīng)用程序。
6)VisualJ++中表單設(shè)計(jì)器的快速應(yīng)用開發(fā)特性使用WFC創(chuàng)建基于表單的應(yīng)用程序變得輕松、簡(jiǎn)單。通過WFC可以方便地使用ActiveX數(shù)據(jù)對(duì)象(ADO,ActiveXDataObjects)來檢索數(shù)據(jù)和執(zhí)行簡(jiǎn)單數(shù)據(jù)的綁定。通過在表單設(shè)計(jì)器中使用ActiveX數(shù)據(jù)對(duì)象,可以快速地在表單中訪問和顯示數(shù)據(jù)。VisualJ++能結(jié)合微軟的一貫的編程風(fēng)格,很方便進(jìn)行Java的應(yīng)用開發(fā),但它的移植性較差,不是純的Java開發(fā)環(huán)境。
12、Eclipse
Eclipse是一種可擴(kuò)展的開放源代碼IDE。2001年11月,IBM公司捐出價(jià)值4,000萬美元的源代碼組建了Eclipse聯(lián)盟,并由該聯(lián)盟負(fù)責(zé)這種工具的后續(xù)開發(fā)。集成開發(fā)環(huán)境(IDE)經(jīng)常將其應(yīng)用范圍限定在“開發(fā)、構(gòu)建和調(diào)試”的周期之中。為了幫助集成開發(fā)環(huán)境(IDE)克服目前的局限性,業(yè)界廠商合作創(chuàng)建了Eclipse平臺(tái)。Eclipse允許在同一IDE中集成來自不同供應(yīng)商的工具,并實(shí)現(xiàn)了工具之間的互操作性,從而顯著改變了項(xiàng)目工作流程,使開發(fā)者可以專注在實(shí)際的嵌入式目標(biāo)上。Eclipse框架的這種靈活性來源于其擴(kuò)展點(diǎn)。它們是在XML中定義的已知接口,并充當(dāng)插件的耦合點(diǎn)。擴(kuò)展點(diǎn)的范圍包括從用在常規(guī)表述過濾器中的簡(jiǎn)單字符串,到一個(gè)Java類的描述。任何Eclipse插件定義的擴(kuò)展點(diǎn)都能夠被其它插件使用,反之,任何Eclipse插件也可以遵從其它插件定義的擴(kuò)展點(diǎn)。除了解由擴(kuò)展點(diǎn)定義的接口外,插件不知道它們通過擴(kuò)展點(diǎn)提供的服務(wù)將如何被使用。利用Eclipse,我們可以將高級(jí)設(shè)計(jì)(也許是采用UML)與低級(jí)開發(fā)工具(如應(yīng)用調(diào)試器等)結(jié)合在一起。如果這些互相補(bǔ)充的獨(dú)立工具采用Eclipse擴(kuò)展點(diǎn)彼此連接,那么當(dāng)我們用調(diào)試器逐一檢查應(yīng)用時(shí),UML對(duì)話框可以突出顯示我們正在關(guān)注的器件。事實(shí)上,由于Eclipse并不了解開發(fā)語言,所以無論Java語言調(diào)試器、C/C++調(diào)試器還是匯編調(diào)試器都是有效的,并可以在相同的框架內(nèi)同時(shí)瞄準(zhǔn)不同的進(jìn)程或節(jié)點(diǎn)。Eclipse的最大特點(diǎn)是它能接受由Java開發(fā)者自己編寫的開放源代碼插件,這類似于微軟公司的VisualStudio和Sun微系統(tǒng)公司的NetBeans平臺(tái)。Eclipse為工具開發(fā)商提供了更好的靈活性,使他們能更好地控制自己的軟件技術(shù)。Eclipse聯(lián)盟已經(jīng)宣布將在2004年中期發(fā)布其3.0版軟件。這是一款非常受歡迎的java開發(fā)工具,這國(guó)內(nèi)的用戶越來越多,實(shí)際上實(shí)用它java開發(fā)人員是最多的。缺點(diǎn)就是較復(fù)雜,對(duì)初學(xué)者來說,理解起來比較困難。
作者長(zhǎng)期從事網(wǎng)管軟件的開發(fā)工作 網(wǎng)絡(luò)設(shè)備的配置管理模塊 需要對(duì)網(wǎng)絡(luò)設(shè)備的大量參數(shù)進(jìn)行配置工作 設(shè)計(jì) 開發(fā)配置管理模塊的界面成為整個(gè)網(wǎng)管系統(tǒng)的難點(diǎn) 尤其是用Java語言開發(fā)時(shí) 需要編制大量的界面布局 事件處理等代碼 網(wǎng)管軟件開發(fā)的主要工作量就集中在此 制作一個(gè)類似于Delphi JBuilder等可視化開發(fā)工具的對(duì)象查看器的參數(shù)配置控件用于項(xiàng)目的優(yōu)點(diǎn)是顯而易見的 界面顯得很專業(yè) 容易做到使整個(gè)系統(tǒng)的風(fēng)格趨于一致 使用靈活 代碼量大大減小 ……最終的使用效果如下圖所示 作者本人把它稱為屬性編輯器 它的主要特征是 是一個(gè)兩列多行的表格 第一列用來顯示屬性名稱 第二列用來顯示和編輯屬性值 屬性值的顯示和編輯可以有多種方式 如文本框輸入 下拉框選擇 組合框選擇 自定義的彈出式對(duì)話框等 當(dāng)屬性被編輯后 可以向感興趣的對(duì)象發(fā)出通知 下面就屬性編輯器的設(shè)計(jì)思路和編制過程進(jìn)行具體的解釋說明 設(shè)計(jì)思路根據(jù)屬性編輯器的主要界面特征 選擇JTable作為編輯器的基類 JTable是Swing中最復(fù)雜的組件之一 它主要被用來顯示數(shù)據(jù)行和數(shù)據(jù)列 它可以為每個(gè)數(shù)據(jù)單元分別提供繪制器和編輯器 是典型的MVC(模型Model 視圖View 控制Control)模式的實(shí)現(xiàn)者 設(shè)計(jì)屬性編輯器為一個(gè)兩列的JTable 每一行數(shù)據(jù)的第一列存放不重復(fù)的字符串 作為屬性的名稱 第二列保存Object對(duì)象 根據(jù)其具體數(shù)據(jù)類型 設(shè)置其單元繪制器和單元編輯器 一般單元繪制器用系統(tǒng)默認(rèn)的JLabel即可 而單元編輯器則必須提供定制的控件 如對(duì)字符串型數(shù)據(jù) 用JTextField或者JComboBox 對(duì)布爾型數(shù)據(jù) 用JCheckBox 對(duì)特殊類型 可以提供JDialog 對(duì)話框的主要界面可以由使用本屬性編輯器的程序員自行定制 屬性編輯器還要提供相關(guān)接口 如屬性值是否只讀 屬性值變化時(shí)必須通知監(jiān)聽者 等等 屬性編輯器的具體設(shè)計(jì) 請(qǐng)參見下圖 限于篇幅 該圖只簡(jiǎn)單列舉了幾個(gè)主要的類之間的關(guān)系和一些重要的變量和方法 屬性編輯器的制作過程屬性編輯器是從JTable上繼承下來的 必須給它定義一個(gè)DefaultTableModel的子類 用來作為屬性編輯器的數(shù)據(jù)模型 存放屬性名和屬性值 因?yàn)樗辉趯傩跃庉嬈鲀?nèi)部使用 所以可以定義為屬性編輯器的內(nèi)部類 public class PropertyEditor extends JTable {protected class PropertyEditorModel extends DefaultTableModel{public PropertyEditorModel() {super( ); // 只有兩個(gè)列}public String getColumnName(int col) {return ; // 不需要列標(biāo)題}public boolean isCellEditable(int row int col) {if(col == )return false; // 第一列是屬性名 不可編輯else// 屬性值是否可編輯要看用戶指定的情況return ((Boolean)propertyEditable get(this getValueAt(row ))) booleanValue();}}}要實(shí)現(xiàn)定制的單元繪制器和編輯器 必須覆蓋JTable的getCellEditor和getCellRenderer方法 那些已經(jīng)做好的繪制器 編輯器和該屬性值是否允許編輯都可以根據(jù)屬性名保存在Hashtable里 需要的時(shí)候根據(jù)屬性名取出來 /*** 每一個(gè)屬性項(xiàng)都對(duì)應(yīng)一個(gè)單元編輯器 用Hashtable來保存這些編輯器*/protected Hashtable propertyEditors = new Hashtable( );/*** 每一個(gè)屬性項(xiàng)都對(duì)應(yīng)一個(gè)單元渲染器*/protected Hashtable propertyRenderers = new Hashtable( );/*** 屬性是否可編輯*/protected Hashtable propertyEditable = new Hashtable( );/*** 獲取指定單元格的編輯器* @param row 行* @param col 列*/public TableCellEditor getCellEditor(int row int col) {TableCellEditor editor = null;if(col == ) { // 屬性值列才需要編輯器 這個(gè)判斷條件不要也可 效率會(huì)低一點(diǎn) editor = (TableCellEditor)propertyEditors get(this getValueAt(row ));}if(editor == null) { // 沒找到編輯器 則用系統(tǒng)默認(rèn)的 editor = super getCellEditor(row col);}return editor;}/*** 獲取指定單元格的渲染器*/public TableCellRenderer getCellRenderer(int row int col) {TableCellRenderer renderer = null;if(col == ) {renderer = (TableCellRenderer)propertyRenderers get(this getValueAt(row ));}if(renderer == null) {renderer = super getCellRenderer(row col);}// 給表格元素提供Hint提示if(renderer instanceof JComponent) {Object v = this getModel() getValueAt(row col);if(v == null) { // 屬性值有可能為空 則取屬性名 屬性名必不為空 v = this getModel() getValueAt(row );}((JComponent)renderer) setToolTipText(v toString());}return renderer;}如何確定哪個(gè)屬性用哪一種編輯器呢?可以根據(jù)用戶程序員傳入的參數(shù)來確定 對(duì)傳入的整數(shù)型數(shù)據(jù) 則用LongCellEditor 字符串型的當(dāng)然用StringCellEditor了 其它依次類推 以整數(shù)型來舉例 /*** 在屬性表中增加整數(shù)屬性 允許為空值 編輯器和渲染器為long型編輯器和渲染器 * 當(dāng)屬性值為空值時(shí) 必須寫成 * addProperty( pName (Long)null)* @param propertyName 屬性名* @param longNumObj 屬性初始值*/public void addProperty(String propertyName Long longNumObj) {if(propertyName == null) throw new RuntimeException( Coding error : property name can NOT be null ! );Object[] row = new Object[ ];row[ ] = propertyName;row[ ] = longNumObj;appendRow(row); // 往表格增加行propertyEditors put(propertyName longEditor); // 添加整型編輯器propertyRenderers put(propertyName longRenderer); // 添加整型繪制器propertyEditable put(propertyName new Boolean(true)); // 設(shè)置該屬性允許編輯}給屬性編輯器加上get和set接口 /*** 根據(jù)屬性名得到屬性值* @param propertyName 屬性名*/public Object getPropertyValue(String propertyName) {Object retValue = null;for(int i = ; i ptm.getRowCount(); i++) {if(ptm.getValueAt(i, 0).equals(propertyName)) {retValue = ptm.getValueAt(i, 1);break;}}return retValue;}/*** 設(shè)置屬性值* @param propertyName 屬性名* @param newValue 新的屬性值*/public void setPropertyValue(String propertyName, Object newValue) {for(int i = 0; i ptm.getRowCount(); i++) {if(ptm.getValueAt(i, 0).equals(propertyName)) {ptm.setValueAt(newValue, i, 1);break;}}}好了,屬性值編輯器的大框架已經(jīng)完成了,下面以整數(shù)型的單元編輯器為例,簡(jiǎn)單說明單元編輯器的制作方法,雙精度型和字符串型的和它類似,最復(fù)雜的用戶自定義對(duì)話框型的,留待讀者自己看源代碼吧(反正源代碼里面有詳細(xì)的注釋的J)。tW.WinGWit.cOm/*** 創(chuàng)建并初始化long型數(shù)據(jù)的編輯器和渲染器*/private void createLongEditorRenderer() {final JTextField longTextField = new JTextField("0", 5); // 用文本輸入框做輸入控件longTextField.setHorizontalAlignment(JTextField.LEFT);longEditor = new DefaultCellEditor(longTextField) {private Object previousValue = null; public Object getCellEditorValue() {if(longTextField.getText().equals("") lishixinzhi/Article/program/Java/JSP/201311/19202
一. 高亮的內(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法著色中文本要使用多種風(fēng)格的樣式, 所以這些文本編輯器的document要使用StyledDocument.
JTextArea使用的是PlainDocument, 此document不能進(jìn)行多種格式的著色.
JTextPane, JEditorPane使用的是StyledDocument, 默認(rèn)就可以使用.
為了實(shí)現(xiàn)語法著色, 可以繼承自DefaultStyledDocument, 設(shè)置其為這些文本編輯器的documet, 或者也可以直接使用JTextPane, JEditorPane來做. 為了方便, 這里就直接使用JTextPane了.
四. 何時(shí)進(jìn)行著色.
當(dāng)文本編輯器中有字符被插入或者刪除時(shí), 文本的內(nèi)容就發(fā)生了變化, 這時(shí)檢查, 進(jìn)行著色.
為了監(jiān)視到文本的內(nèi)容發(fā)生了變化, 要給document添加一個(gè)DocumentListener監(jiān)聽器, 在他的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前面單詞開始的下標(biāo)和pos+len開始單詞結(jié)束的下標(biāo). 所以上例中要著色的范圍是"public int".
提供了方法indexOfWordStart來取得pos前單詞開始的下標(biāo), 方法indexOfWordEnd來取得pos后單詞結(jié)束的下標(biāo).
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個(gè)非單詞字符.
for (; pos 0 isWordCharacter(doc, pos - 1); --pos);
return pos;
}
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個(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)鍵字著色.
從著色范圍的開始下標(biāo)起進(jìn)行判斷, 如果是以字母開或者下劃線開頭, 則說明是單詞, 那么先取得這個(gè)單詞, 如果這個(gè)單詞是關(guān)鍵字, 就進(jìn)行關(guān)鍵字著色, 如果不是, 就進(jìn)行普通的著色. 著色完這個(gè)單詞后, 繼續(xù)后面的著色處理. 已經(jīng)著色過的字符, 就不再進(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 == '_') {
// 如果是以字母或者下劃線開頭, 說明是單詞
// 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)用的過程中, 不能修改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來實(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)行語法高亮, 文本輸入組件的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 == '_') {
// 如果是以字母或者下劃線開頭, 說明是單詞
// 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)用的過程中, 不能修改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í), 它所在的單詞開始的下標(biāo). ?±wor^d?± (^表示pos, ?±表示開始或結(jié)束的下標(biāo))
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public int indexOfWordStart(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個(gè)非單詞字符.
for (; pos 0 isWordCharacter(doc, pos - 1); --pos);
return pos;
}
/**
* 取得下標(biāo)為pos時(shí), 它所在的單詞結(jié)束的下標(biāo). ?±wor^d?± (^表示pos, ?±表示開始或結(jié)束的下標(biāo))
*
* @param doc
* @param pos
* @return
* @throws BadLocationException
*/
public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {
// 從pos開始向前找到第一個(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) {}
}
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class f1 extends Frame implements ActionListener
{
private MenuBar menubar=new MenuBar();
private Menu filemenu=new Menu("文件");
private Menu editmenu=new Menu("編輯");
private Menu formmenu=new Menu("格式");
private MenuItem[] itemf=new MenuItem[4];
private MenuItem[] iteme=new MenuItem[6];
private MenuItem[] items=new MenuItem[2];
private TextArea tf=new TextArea();
public int a=0,b=0,c=0,style=Font.PLAIN,size=15;
public String s1="red:"+a+" "+"green:"+b+" "+"blue"+c,
s2="宋體";
public String[] sz1={"10","16","24","30","32","36"},
sz2={"宋體","黑體","幼圓","隸書","行楷","Arial","Georgia"},
sz3={"粗體","傾斜","常規(guī)","粗斜"};
JDialog dialog=new JDialog(this,"字體",true);
Container cp=dialog.getContentPane();
JLabel[] lb=new JLabel[8];
JLabel lb1=new JLabel(s1,JLabel.LEFT);
JButton b1=new JButton("確定"),
b2=new JButton("取消");
JComboBox jc1=new JComboBox(),
jc2=new JComboBox(),
jc3=new JComboBox();
JScrollBar jb1=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
JScrollBar jb2=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
JScrollBar jb3=new JScrollBar(JScrollBar.HORIZONTAL,10,5,0,260);
eclipse(免費(fèi)),MyEclipse(比前者多集成了一些東西,大部分版本都已破解),NetBeans(免費(fèi))
我所知道的軟件公司用eclipse的比較多。我們公司用的是JDeveloper,購買的正版的。
如果公司用的是收費(fèi)的,說明比免費(fèi)的好用。其實(shí)這些IDE的界面都基本一樣,操作也很接近,只是某些操作簡(jiǎn)化程度不同罷了。關(guān)鍵是JAVA基礎(chǔ)扎實(shí),學(xué)用軟件其實(shí)很快的,大多數(shù)公司會(huì)花一兩個(gè)星期培訓(xùn)你。初學(xué)期間就用好eclipse就行了。