成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇學(xué)會開發(fā)摸魚看書的側(cè)邊欄窗體

開發(fā) 前端
總有人拿到產(chǎn)品的需求,就著急開干,反正也懶的想開發(fā)中會發(fā)生啥,上線后多少人使用,管它三七二十一先堆起來代碼看一看,反正能跑就行,無論代碼還是你!

[[432993]]

一、說明

方向不對,努力白費!

總有人拿到產(chǎn)品的需求,就著急開干,反正也懶的想開發(fā)中會發(fā)生啥,上線后多少人使用,管它三七二十一先堆起來代碼看一看,反正能跑就行,無論代碼還是你!

其實很多時候在編寫代碼前,所需要做的技術(shù)調(diào)研、架構(gòu)設(shè)計、模塊分層、數(shù)據(jù)結(jié)構(gòu)、詳細(xì)分析、方案評審等,與三七二十一那家伙對比起來,好像都會顯得有點慢。但這個看上去慢的過程,卻能解決以后很多常見和麻煩的問題,比如產(chǎn)品需求迭代、業(yè)務(wù)流程變更、代碼邏輯更改、線上異常排查。雖然看著慢,但這個積基樹本的過程就像打地基一樣,總得有一個穩(wěn)定的根基,才能蓋好整棟大樓。萬丈高樓平地起,勿在浮沙筑高臺

二、需求目的

如果你需要開發(fā)一個自定義功能的插件,無論是處理代碼、輔助ORM生成、日志信息記錄等,都會需要進(jìn)行一個插件的功能配置進(jìn)行初始化操作以及把對應(yīng)功能展示到整個 IDEA 窗體中的右邊欄或者下邊欄中,這樣才能滿足一個插件的基本需求。

那么這樣就需要在 IDEA 窗體 File -> Settings 中擴展自己的配置窗體,以及開發(fā)自己需要的 ToolWindow 嵌入到 IDEA 中(左側(cè)、右側(cè)、下側(cè)),這里窗體的開發(fā)需要用到 Swing 但目前在 IDEA 中開發(fā)這樣的功能只需要拖拽窗體就可以,還是蠻容易的。

那么接下來我們以一個在 IDEA 中摸魚看書的場景為案例,學(xué)習(xí)配置窗體和閱讀窗體的功能實現(xiàn)。

三、案例開發(fā)

1. 工程結(jié)構(gòu)

  1. guide-idea-plugin-tool-window 
  2. ├── .gradle 
  3. └── src 
  4.     ├── main 
  5.     │   └── java 
  6.     │    └── cn.bugstack.guide.idea.plugin  
  7.     │        └── factory 
  8.     │        │   ├── ReadFactory.java  
  9.     │        │   └── SettingFactory.java 
  10.     │        └── ui 
  11.     │        │  ├── ReadUI.java  
  12.     │        │  ├── ReadUI.form 
  13.     │        │  ├── SettingUI.java   
  14.     │        │  └── SettingUI.form 
  15.     │        └── Config     
  16.     ├── resources 
  17.     │   └── META-INF 
  18.     │       └── plugin.xml  
  19.     ├── build.gradle   
  20.     └── gradle.properties 

此工程主要涉及兩部分,在factory中一個是配置窗體、一個是閱讀窗體,與之對應(yīng)的兩組UI的實現(xiàn)。最后 factory 類的實現(xiàn)都會配置到 plugin.xml 中進(jìn)行使用,同時也是在 plugin.xml 中控制窗體位置和圖標(biāo)。

2. 創(chuàng)建 UI 窗體

2.1 創(chuàng)建方式

New -> Swing UI Designer -> GUI Form

  • 在 Java 中創(chuàng)建窗體的方式主要有 AWT、Swing、JavaFx,由于 IDEA 使用 Swing 開發(fā),所以這里創(chuàng)建 Swing 窗體的兼容性會更好。
  • 那么這里 Swing 窗體的創(chuàng)建可以是自己手寫窗體結(jié)構(gòu),也可以使用可視化拖拽的 GUI Form 如果你的窗體不復(fù)雜,其實拖拽的方式就可以滿足使用。

2.2 配置頁窗體

  1. public class SettingUI { 
  2.  
  3.     private JPanel mainPanel; 
  4.     private JPanel settingPanel; 
  5.     private JLabel urlLabel; 
  6.     private JTextField urlTextField; 
  7.     private JButton urlBtn; 
  8.  
  9.     public SettingUI() { 
  10.         // 給按鈕添加一個選擇文件的事件 
  11.         urlBtn.addActionListener(e -> { 
  12.             JFileChooser fileChooser = new JFileChooser(); 
  13.             fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
  14.             fileChooser.showOpenDialog(settingPanel); 
  15.             File file = fileChooser.getSelectedFile(); 
  16.             urlTextField.setText(file.getPath()); 
  17.         }); 
  18.     } 
  19.  
  20.     public JComponent getComponent() { 
  21.         return mainPanel; 
  22.     } 
  23.  
  24.     public JTextField getUrlTextField() { 
  25.         return urlTextField; 
  26.     } 

  • 配置頁窗體主要提供文章路徑的選擇,這里需要用到的標(biāo)簽包括:JLabel、JTextField、JButton
  • 在使用 GUI Form 創(chuàng)建完窗體后,就會出現(xiàn)這樣一個可視化的頁面,右側(cè)可以把各類標(biāo)簽拖到中間的面板中,左側(cè)進(jìn)行設(shè)置展示名稱和屬性名稱。
  • 最終這里的代碼標(biāo)簽代碼會展示到 SettingUI.java 中,而渲染內(nèi)容會被隱藏,這樣的方式也比較方便控制一些自定義內(nèi)容的添加,例如事件和新窗體等
  • 另外在 SettingUI.java 中,還需要在構(gòu)造函數(shù)添加一個按鈕事件,用于打開文件選擇器,把我們需要打開的文件,設(shè)置到 urlTextField 中。

2.3 閱讀頁窗體

  1. public class ReadUI { 
  2.  
  3.     private JPanel mainPanel; 
  4.     private JTextPane textContent; 
  5.  
  6.     public JComponent getComponent() { 
  7.         return mainPanel; 
  8.     } 
  9.  
  10.     public JTextPane getTextContent() { 
  11.         return textContent; 
  12.     } 
  13.  

在窗體創(chuàng)建和配置頁窗體是一樣的,也是通過拖拽到面板中,用于展示路徑文件內(nèi)容。

你可以適當(dāng)?shù)奶砑右恍┢渌粹o進(jìn)去,比如翻頁閱讀、滾動條、字?jǐn)?shù)展示等。

3. ToolWindow 工具框

為了把我們自己實現(xiàn)的閱讀窗體放到整個 IDEA 右側(cè)側(cè)邊欄中,我們需要創(chuàng)建一個實現(xiàn)了 ToolWindowFactory 的接口,并把實現(xiàn)類配置到 plugin.xml 中

  1. public class ReadFactory implements ToolWindowFactory { 
  2.  
  3.     private ReadUI readUI = new ReadUI(); 
  4.  
  5.     @Override 
  6.     public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { 
  7.         // 獲取內(nèi)容工廠的實例 
  8.         ContentFactory contentFactory = ContentFactory.SERVICE.getInstance(); 
  9.         // 獲取 ToolWindow 顯示的內(nèi)容 
  10.         Content content = contentFactory.createContent(readUI.getComponent(), ""false); 
  11.         // 設(shè)置 ToolWindow 顯示的內(nèi)容 
  12.         toolWindow.getContentManager().addContent(content); 
  13.         // 全局使用 
  14.         Config.readUI = readUI; 
  15.     } 
  16.  

接口方法 ToolWindowFactory#createToolWindowContent 是需要自己工具框類實現(xiàn)的方法,在這個 createToolWindowContent 方法中把自己的窗體 ReadUI 實例化后填充進(jìn)去即可。

添加窗體的補助主要依賴于 ContentFactory.SERVICE.getInstance() 創(chuàng)建出 ContentFactory 并最終使用 toolWindow 添加窗體顯示 UI 即可。

這里我們額外的還添加了一個全局屬性 Config.readUI 這是為了后續(xù)可以在配置窗體中使用這個 UI 進(jìn)行設(shè)置文件內(nèi)容。

4. Configurable 配置框

  1. public class SettingFactory implements SearchableConfigurable { 
  2.  
  3.     private SettingUI settingUI = new SettingUI(); 
  4.  
  5.     @Override 
  6.     public @NotNull String getId() { 
  7.         return "test.id"
  8.     } 
  9.  
  10.     @Override 
  11.     public @Nls(capitalization = Nls.Capitalization.Title) String getDisplayName() { 
  12.         return "test-config"
  13.     } 
  14.  
  15.     @Override 
  16.     public @Nullable JComponent createComponent() { 
  17.         return settingUI.getComponent(); 
  18.     } 
  19.  
  20.     @Override 
  21.     public boolean isModified() { 
  22.         return true
  23.     } 
  24.  
  25.     @Override 
  26.     public void apply() throws ConfigurationException { 
  27.         String url = settingUI.getUrlTextField().getText(); 
  28.         // 設(shè)置文本信息 
  29.         try { 
  30.             File file = new File(url); 
  31.             RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); 
  32.             randomAccessFile.seek(0); 
  33.  
  34.             byte[] bytes = new byte[1024 * 1024]; 
  35.             int readSize = randomAccessFile.read(bytes); 
  36.  
  37.             byte[] copy = new byte[readSize]; 
  38.             System.arraycopy(bytes, 0, copy, 0, readSize); 
  39.  
  40.             String str = new String(copy, StandardCharsets.UTF_8); 
  41.  
  42.             // 設(shè)置內(nèi)容 
  43.             Config.readUI.getTextContent().setText(str); 
  44.  
  45.         } catch (Exception ignore) { 
  46.         } 
  47.     } 
  48.  
  • 實現(xiàn)自 SearchableConfigurable 接口的方法比較多,包括:getId、getDisplayName、createComponent、isModified、apply 這些里面用于寫邏輯實現(xiàn)的主要是 createComponent 和 apply
  • createComponent 方法主要是把我們自己創(chuàng)建的 UI 面板提供給 JComponent
  • apply 是一個事件,當(dāng)我們點擊完成配置的 OK、完成,時候就會觸發(fā)到這個方法。在這個方法中我們拿到文件的 URL 地址使用 RandomAccessFile 進(jìn)行讀取解析文件,并最終把文件內(nèi)容展示到閱讀窗體中 Config.readUI.getTextContent().setText(str);

5. 配置 plugin.xml

  1. <extensions defaultExtensionNs="com.intellij"
  2.     <!-- Add your extensions here --> 
  3.     <!-- 配置 File -> Settings -> Tools --> 
  4.     <projectConfigurable groupId="tools" displayName="My Test Config" id="test.id" 
  5.                          instance="cn.bugstack.guide.idea.plugin.factory.SettingFactory"/> 
  6.                           
  7.     <!-- 窗體 (IDEA 界面右側(cè)) --> 
  8.     <toolWindow id="Read-Book" secondary="false" anchor="right" icon="/icons/logo.png" 
  9.                 factoryClass="cn.bugstack.guide.idea.plugin.factory.ReadFactory"/> 
  10. </extensions> 

 

本次在 plugin.xml 中的主要配置內(nèi)容就是 projectConfigurable 和 toolWindow,另外在 toolWindow 中還添加了一個 icon 的 logo,配置完成后就可以在 IDEA 頁面展示出我們的自己添加的窗體了。

四、插件測試

  • 通過 Plugin 啟動插件,這個時候會打開一個新的 IDEA 窗體,在這個新窗體中就可以看到我們添加的功能了。

配置文件路徑

  • 點擊選擇按鈕,選擇你的文件位置,選擇后點擊 OK

查看展示文件

確認(rèn)好文件路徑后,就可以再右側(cè)欄看到自己的文件展示內(nèi)容了。是不是在擴展些,就適合你摸魚了!?

五、總結(jié)

學(xué)習(xí)自定義開發(fā)UI,把UI填充到需要放置的 IDEA 窗體位置,并在窗體中添加功能的流程步驟,其實主要包括三方面:Swing UI、Factory 實現(xiàn)類、plugin 配置。

在 plugin 配置中,主要包括如窗體ID、位置、icon圖標(biāo)、對應(yīng)的實現(xiàn)類,如果不添加這些是不能正常展示窗體信息的。

 

另外可以以這個案例為基礎(chǔ),添加自己想完成的功能,比如讓這個摸魚看書的功能更加完善,可以支持不同類型的文件,甚至可以是 PDF 的閱讀,以及你想看的書籍。

 

責(zé)任編輯:武曉燕 來源: bugstack蟲洞棧
相關(guān)推薦

2022-01-02 08:43:46

Python

2022-06-30 22:53:18

數(shù)據(jù)結(jié)構(gòu)算法

2021-08-01 07:19:16

語言OpenrestyNginx

2022-02-07 11:01:23

ZooKeeper

2021-05-11 08:54:59

建造者模式設(shè)計

2021-07-02 09:45:29

MySQL InnoDB數(shù)據(jù)

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構(gòu)

2023-11-28 08:29:31

Rust內(nèi)存布局

2022-08-23 08:00:59

磁盤性能網(wǎng)絡(luò)

2021-10-26 10:40:26

代理模式虛擬

2022-05-17 08:02:55

GoTryLock模式

2021-12-04 22:05:02

Linux

2022-01-12 07:36:01

Java數(shù)據(jù)ByteBuffer

2021-07-02 08:51:29

源碼參數(shù)Thread

2021-09-28 08:59:30

復(fù)原IP地址

2021-10-14 10:22:19

逃逸JVM性能

2022-04-12 08:30:52

回調(diào)函數(shù)代碼調(diào)試
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线色网 | 91久久国产综合久久91精品网站 | 伊人爽| 亚洲毛片| 精品国产乱码久久久久久图片 | 国产一区二区电影网 | 99久久婷婷| 亚洲高清在线 | 91九色麻豆| 一级片在线播放 | 综合色久| 免费在线观看成人 | 国产精品a久久久久 | 国产2区 | 午夜精品久久久久久久久久久久久 | 黄网站在线播放 | 欧美日韩在线不卡 | 在线观看a视频 | 国产精品久久久久久久免费大片 | 午夜久久久久久久久久一区二区 | 成人免费观看男女羞羞视频 | 红色av社区| 久久精品91久久久久久再现 | 精品久久久久一区二区国产 | 精品三级在线观看 | 精品国产一区二区国模嫣然 | 国产高清在线观看 | 在线一区二区三区 | 国产96在线| 亚洲免费在线 | 成人亚洲 | 日韩中文在线视频 | 午夜视频免费在线观看 | 亚洲精品一区二区在线观看 | 欧美日韩成人一区二区 | 久久精品国产一区二区三区不卡 | 精品三区 | 精品国产乱码久久久久久中文 | 黄色小视频大全 | 一级毛片成人免费看a | 欧美一级大片免费观看 |