日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一時(shí)興起,自己動(dòng)手開(kāi)發(fā)了個(gè)IDEA插件!

前言

最近工作比較閑,自己琢磨點(diǎn)東西,一時(shí)興起想自己做個(gè)IDEA插件玩玩,說(shuō)不定還能賣(mài)錢(qián),哈哈。

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)五寨,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18980820575

版本工具

  • 說(shuō)明JDK1.8
  • IDEA2020.1
  • 插件項(xiàng)目基于gradle構(gòu)建。
  • 知識(shí)背景:swing

達(dá)到什么目標(biāo)?

本實(shí)例實(shí)現(xiàn)一個(gè)Idea的插件,彈出一個(gè)表單Dialog,然后點(diǎn)擊按鈕,獲取表單里輸入的內(nèi)容,然后將內(nèi)容打印在表單的上方。

成品圖展示:

項(xiàng)目初始化

新建一個(gè)gradle項(xiàng)目,修改其build.gradle文件:

 
 
 
 
  1. plugins { 
  2.     id 'java' 
  3.     id 'org.jetbrains.intellij' version '0.4.14' //引入intellij的gradle插件 
  4.   
  5. group 'org.example' 
  6. version '1.0' //定義jar包/zip包的版本號(hào) 
  7.   
  8. sourceCompatibility = 1.8 //限制jdk的使用版本號(hào),這里限制到8,表示生成的idea插件只能運(yùn)行在jdk8以上的環(huán)境中 
  9.   
  10. repositories { 
  11.     mavenCentral() //遠(yuǎn)程倉(cāng)庫(kù) 
  12.   
  13. dependencies { 
  14.     //這里引別的依賴(lài)包 
  15.     testCompile group: 'junit', name: 'junit', version: '4.12' 
  16.   
  17. // See https://github.com/JetBrains/gradle-intellij-plugin/ 
  18. intellij { 
  19.     // 這里是指打插件包的時(shí)候用idea什么版本的依賴(lài)包打 
  20.     // 比如這里用2019.3打包,如果你的插件實(shí)現(xiàn)源碼里用了2019.3不存在的依賴(lài)包或類(lèi),就會(huì)報(bào)錯(cuò) 
  21.     // 一般就填當(dāng)前IDEA的版本號(hào)即可 
  22.     version "2019.3" 
  23.   
  24. patchPluginXml { 
  25.   
  26.     //changeNotes里的內(nèi)容展示位置參考圖14 
  27.     changeNotes """ 
  28.       1.0版本. 
  29.  
  30.       第1.0版本:初始化這個(gè)測(cè)試插件項(xiàng)目""" 
  31.   
  32.     // 這個(gè)意思是說(shuō)當(dāng)前定義的這個(gè)插件最早支持到什么版本的IDEA 
  33.     // 這里配置sinceBuild=191,表示插件只能被版本號(hào)大于等于2019.1版本的IDEA安裝,低于這個(gè)版本的將拋無(wú)法兼容的錯(cuò)誤 
  34.     // ↑上方參考這篇問(wèn)答:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003338799-Build-compatible-plugin 
  35.     sinceBuild "191" 

然后Idea的右邊欄gradle將會(huì)多出intellij選項(xiàng):

“這里說(shuō)下runIde,它用來(lái)調(diào)試插件,運(yùn)行它會(huì)再次啟動(dòng)一個(gè)Idea,這個(gè)Idea會(huì)自動(dòng)安裝上你當(dāng)前定義的插件包,讓你用來(lái)調(diào)試。

新增plugin.xml

這個(gè)文件非常重要,它可以指定你定義的插件出現(xiàn)在IDEA的哪個(gè)位置,可以指定具體的處理邏輯,還可以定義插件名稱(chēng)、子名稱(chēng)等等。

這個(gè)文件位于MATE-INF下:

配置內(nèi)容為:

 
 
 
 
  1.  
  2.      
  3.     plugin.test 
  4.      
  5.     PluginTest 
  6.     你公司的名字 
  7.  
  8.      
  9.     
  10.     Plugin Test
     
  11.     第一行:?jiǎn)渭冎皇莻€(gè)測(cè)試
     
  12.     第二行:都說(shuō)了只是個(gè)測(cè)試(● ̄(?) ̄●)
     
  13.     你猜猜這是哪個(gè)網(wǎng)站? 
  14.     v1.0 
  15.     ]]> 
  16.      
  17.      
  18.          
  19.      
  20.  
  21.      
  22.      
  23.  
  24.      
  25.          
  26.          
  27.              
  28.              
  29.              
  30.             
  31.                     class="plugin.test.FromAction" 
  32.                     text="表單測(cè)試" description="表單測(cè)試描述"/> 
  33.          
  34.      
  35.  

然后定義一個(gè)Action類(lèi),記為FormAction,繼承AnAction,實(shí)現(xiàn)其抽象方法actionPerformed即可:

 
 
 
 
  1. public class FromAction extends AnAction { 
  2.     @Override 
  3.     public void actionPerformed(@NotNull AnActionEvent e) { 
  4.         //TODO 這里放插件邏輯 
  5.     } 

啟動(dòng)

現(xiàn)在雙擊runIde即可調(diào)出另外一個(gè)安裝了這個(gè)插件的IDEA界面,然后可以看運(yùn)行結(jié)果進(jìn)行調(diào)試。runIde還支持debug模式,不過(guò)運(yùn)行時(shí)要右擊選擇:

來(lái)看下調(diào)試IDEA的界面運(yùn)行效果:

定義Action

1. 定義會(huì)話框類(lèi)

經(jīng)過(guò)上面三步的配置,插件的基本樣式已經(jīng)展示出來(lái),但是點(diǎn)擊下方“表單測(cè)試”的action,并沒(méi)有什么用,因?yàn)槠浣壎ǖ腇ormAction類(lèi)里沒(méi)有任何有意義的實(shí)現(xiàn)?,F(xiàn)在來(lái)實(shí)現(xiàn)開(kāi)始的目標(biāo),點(diǎn)擊“表單測(cè)試”后,彈出一個(gè)自定義的表單會(huì)話框,然后點(diǎn)擊按鈕,獲取表單內(nèi)容后打印在會(huì)話框內(nèi)。

會(huì)話框(Dialog)需要定義一個(gè)繼承了IDEA的DialogWrapper抽象類(lèi)的子類(lèi),這個(gè)子類(lèi)就是自定義的會(huì)話框?qū)崿F(xiàn),所有的樣式定義、功能觸發(fā)都是放到這個(gè)子類(lèi)里的,現(xiàn)定于如下子類(lèi):

 
 
 
 
  1. public class FormTestDialog extends DialogWrapper { 
  2.   
  3.     private String projectName; //假如需要獲取到項(xiàng)目名,作為該類(lèi)的屬性放進(jìn)來(lái) 
  4.   
  5.     // DialogWrapper沒(méi)有默認(rèn)的無(wú)參構(gòu)造方法,所以需要重寫(xiě)構(gòu)造方法,它提供了很多重載構(gòu)造方法, 
  6.     // 這里使用傳project類(lèi)型參數(shù)的那個(gè),通過(guò)Project對(duì)象可以獲取當(dāng)前IDEA內(nèi)打開(kāi)的項(xiàng)目的一些屬性, 
  7.     // 比如項(xiàng)目名,項(xiàng)目路徑等 
  8.     public FormTestDialog(@Nullable Project project) { 
  9.         super(project); 
  10.         setTitle("表單測(cè)試~~"); // 設(shè)置會(huì)話框標(biāo)題 
  11.         this.projectName = project.getName(); 
  12.     } 
  13.   
  14.     // 重寫(xiě)下面的方法,返回一個(gè)自定義的swing樣式,該樣式會(huì)展示在會(huì)話框的最上方的位置 
  15.     @Override 
  16.     protected JComponent createNorthPanel() { 
  17.         return null; 
  18.     } 
  19.   
  20.     // 重寫(xiě)下面的方法,返回一個(gè)自定義的swing樣式,該樣式會(huì)展示在會(huì)話框的最下方的位置 
  21.     @Override 
  22.     protected JComponent createSouthPanel() { 
  23.         return null; 
  24.     } 
  25.   
  26.     // 重寫(xiě)下面的方法,返回一個(gè)自定義的swing樣式,該樣式會(huì)展示在會(huì)話框的中央位置 
  27.     @Override 
  28.     protected JComponent createCenterPanel() { 
  29.         return null; 
  30.     } 

2. 會(huì)話框模塊&類(lèi)元素對(duì)照

找個(gè)實(shí)際的會(huì)話框?yàn)槔槍?duì)上述中幾個(gè)方法所控制的會(huì)話框里的元素如下:

3. 會(huì)話框方法重定義

按照本文的實(shí)現(xiàn)目標(biāo),自定義的表單主體部分可以位于createCenterPanel里,然后表單的大標(biāo)題可以放到createNorthPanel里,提交按鈕可以放到createSouthPanel里,現(xiàn)在改寫(xiě)如下:

 
 
 
 
  1. public class FormTestDialog extends DialogWrapper { 
  2.   
  3.     private String projectName; 
  4.       
  5.     //swing樣式類(lèi),定義在4.3.2 
  6.     private FormTestSwing formTestSwing = new FormTestSwing(); 
  7.   
  8.     public FormTestDialog(@Nullable Project project) { 
  9.         super(true); 
  10.         setTitle("表單測(cè)試~~"); //設(shè)置會(huì)話框標(biāo)題 
  11.         this.projectName = project.getName(); //獲取到當(dāng)前項(xiàng)目的名稱(chēng) 
  12.         init(); //觸發(fā)一下init方法,否則swing樣式將無(wú)法展示在會(huì)話框 
  13.     } 
  14.   
  15.     @Override 
  16.     protected JComponent createNorthPanel() { 
  17.         return formTestSwing.initNorth(); //返回位于會(huì)話框north位置的swing樣式 
  18.     } 
  19.   
  20.     // 特別說(shuō)明:不需要展示SouthPanel要重寫(xiě)返回null,否則IDEA將展示默認(rèn)的"Cancel"和"OK"按鈕 
  21.     @Override 
  22.     protected JComponent createSouthPanel() { 
  23.         return formTestSwing.initSouth(); 
  24.     } 
  25.   
  26.     @Override 
  27.     protected JComponent createCenterPanel() { 
  28.         //定義表單的主題,放置到IDEA會(huì)話框的中央位置 
  29.         return formTestSwing.initCenter(); 
  30.     } 

4. 自定義swing樣式

下面是放置swing樣式的類(lèi):

 
 
 
 
  1. public class FormTestSwing { 
  2.   
  3.     private JPanel north = new JPanel(); 
  4.   
  5.     private JPanel center = new JPanel(); 
  6.   
  7.     private JPanel south = new JPanel(); 
  8.   
  9.     //為了讓位于底部的按鈕可以拿到組件內(nèi)容,這里把表單組件做成類(lèi)屬性 
  10.     private JLabel r1 = new JLabel("輸出:"); 
  11.     private JLabel r2 = new JLabel("NULL"); 
  12.   
  13.     private JLabel name = new JLabel("姓名:"); 
  14.     private JTextField nameContent = new JTextField(); 
  15.   
  16.     private JLabel age = new JLabel("年齡:"); 
  17.     private JTextField ageContent = new JTextField(); 
  18.   
  19.     public JPanel initNorth() { 
  20.   
  21.         //定義表單的標(biāo)題部分,放置到IDEA會(huì)話框的頂部位置 
  22.   
  23.         JLabel title = new JLabel("表單標(biāo)題"); 
  24.         title.setFont(new Font("微軟雅黑", Font.PLAIN, 26)); //字體樣式 
  25.         title.setHorizontalAlignment(SwingConstants.CENTER); //水平居中 
  26.         title.setVerticalAlignment(SwingConstants.CENTER); //垂直居中 
  27.         north.add(title); 
  28.   
  29.         return north; 
  30.     } 
  31.   
  32.     public JPanel initCenter() { 
  33.   
  34.         //定義表單的主體部分,放置到IDEA會(huì)話框的中央位置 
  35.   
  36.         //一個(gè)簡(jiǎn)單的3行2列的表格布局 
  37.         center.setLayout(new GridLayout(3, 2)); 
  38.   
  39.         //row1:按鈕事件觸發(fā)后將結(jié)果打印在這里 
  40.         r1.setForeground(new Color(255, 47, 93)); //設(shè)置字體顏色 
  41.         center.add(r1); 
  42.         r2.setForeground(new Color(139, 181, 20)); //設(shè)置字體顏色 
  43.         center.add(r2); 
  44.   
  45.         //row2:姓名+文本框 
  46.         center.add(name); 
  47.         center.add(nameContent); 
  48.   
  49.         //row3:年齡+文本框 
  50.         center.add(age); 
  51.         center.add(ageContent); 
  52.   
  53.         return center; 
  54.     } 
  55.   
  56.     public JPanel initSouth() { 
  57.   
  58.         //定義表單的提交按鈕,放置到IDEA會(huì)話框的底部位置 
  59.   
  60.         JButton submit = new JButton("提交"); 
  61.         submit.setHorizontalAlignment(SwingConstants.CENTER); //水平居中 
  62.         submit.setVerticalAlignment(SwingConstants.CENTER); //垂直居中 
  63.         south.add(submit); 
  64.   
  65.         return south; 
  66.     } 

現(xiàn)在點(diǎn)擊下runIde按鈕,同樣的,在調(diào)試IDE里點(diǎn)擊“表單測(cè)試”,然后就會(huì)彈出如下表單框:

“除非有特殊情況需要自定義swing樣式,否則建議不加任何swing樣式,這樣自定義的swing界面是會(huì)隨著IDEA的主題改變而去自適應(yīng)的,比如將圖7中的調(diào)試IDE的主題設(shè)置成Darcula,自定義的表單也會(huì)自適應(yīng)的變成黑色背景:

5. 事件綁定

定義好了樣式,現(xiàn)在給“提交”按鈕綁定一個(gè)事件,現(xiàn)在改寫(xiě)下FormTestSwing.initSouth方法:

 
 
 
 
  1. public JPanel initSouth() { 
  2.   
  3.     //定義表單的提交按鈕,放置到IDEA會(huì)話框的底部位置 
  4.   
  5.     JButton submit = new JButton("提交"); 
  6.     submit.setHorizontalAlignment(SwingConstants.CENTER); //水平居中 
  7.     submit.setVerticalAlignment(SwingConstants.CENTER); //垂直居中 
  8.     south.add(submit); 
  9.   
  10.     //按鈕事件綁定 
  11.     submit.addActionListener(e -> { 
  12.         //獲取到name和age 
  13.         String name = nameContent.getText(); 
  14.         String age = ageContent.getText(); 
  15.         //刷新r2標(biāo)簽里的內(nèi)容,替換為name和age 
  16.         r2.setText(String.format("name:%s, age:%s", name, age)); 
  17.     }); 
  18.   
  19.     return south; 

現(xiàn)在再來(lái)點(diǎn)擊下“提交”按鈕,就可以輸出表單內(nèi)容了:

6. 插件綁定類(lèi):FormAction

之前講過(guò),這個(gè)類(lèi)是插件的入口,結(jié)合上面定義好的表單Dialog,來(lái)看下它是怎么寫(xiě)的:

 
 
 
 
  1. public class FromAction extends AnAction { 
  2.     @Override 
  3.     public void actionPerformed(@NotNull AnActionEvent e) { 
  4.         FormTestDialog formTestDialog = new FormTestDialog(e.getProject()); 
  5.         formTestDialog.setResizable(true); //是否允許用戶(hù)通過(guò)拖拽的方式擴(kuò)大或縮小你的表單框,我這里定義為true,表示允許 
  6.         formTestDialog.show(); 
  7.     } 

7. 插件的打包&安裝

截止到第四步,都只是在調(diào)試IDE里查看效果,如果一個(gè)插件開(kāi)發(fā)完成后,需要被實(shí)際的IDEA安裝,這個(gè)時(shí)候就需要借助打包選項(xiàng)來(lái)打包你的插件,點(diǎn)擊下面的選項(xiàng)構(gòu)建插件:

構(gòu)建完成后,查看build包下的distributions目錄,里面的zip包就可以直接安裝進(jìn)你的IDEA:

然后選擇IDEA的Preferences下的plugins選項(xiàng),彈出如下框,按照?qǐng)D里的指示選擇zip包安裝即可:

然后安裝完成,重啟IDEA即可:

各個(gè)展示模塊對(duì)應(yīng)插件項(xiàng)目里配置的來(lái)源參考下圖:

重啟后出現(xiàn)了跟調(diào)試IDEA里一樣的菜單欄,選中后運(yùn)行成功:

總結(jié)

截止到這里,一個(gè)插件的開(kāi)發(fā)、調(diào)試、安裝就完成了,理論上通過(guò)這個(gè)簡(jiǎn)單的例子就可以實(shí)現(xiàn)一些實(shí)際的功能了,因?yàn)槠渫暾故玖藬?shù)據(jù)輸入到數(shù)據(jù)獲取整個(gè)過(guò)程。

因?yàn)楣ぷ鳟?dāng)中需要寫(xiě)一個(gè)代碼生成器,想要以一個(gè)IDEA插件的方式提供服務(wù),所以在這里做個(gè)記錄,防止以后再次用到時(shí)從零開(kāi)始。

要有一定的swing基礎(chǔ),我在開(kāi)發(fā)代碼生成器的時(shí)候,就是因?yàn)閟wing基礎(chǔ)太差,布局花了非常多的時(shí)間。


分享名稱(chēng):一時(shí)興起,自己動(dòng)手開(kāi)發(fā)了個(gè)IDEA插件!
URL分享:http://m.5511xx.com/article/cdpcgig.html