首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

為 jEdit 4.2 打造專屬背景圖片:Wallpaper 插件開發全紀錄

     編輯:Java 相關知識

需求背景

jEdit 是成熟的 Java 程式編輯器,但原生不支援編輯區背景圖片。本文記錄如何通過修改原始碼(基於 jEdit 4.2 + JDK 1.4)實現編輯區背景圖片平鋪顯示,並提供圖片切換對話框、工具列按鈕一鍵切換。

核心修改點

1. 修改繪製邏輯 org.gjt.sp.jedit.textarea.TextAreaPainter.paintComponent()

在原有行繪製代碼 extensionMgr.paintScreenLineRange(...) 之後,插入背景繪製:

// 原有代碼之後
Rectangle rect = this.getVisibleRect();
Wallpaper.paintWallpaper(gfx, rect.x, rect.y, rect.width, rect.height, this);

關鍵:使用 Graphics2D 合成規則 AlphaComposite.SRC_OVER 設定透明度 (0.2f),實現「文字清晰可見、背景淡雅不干擾」。

2. 新增切換動作 org.gjt.sp.jedit.textarea.JEditTextArea.changeWallpaperDialog()

public void changeWallpaperDialog() {
    if (Wallpaper.changeWallpaper(this)) {
        repaint(); // 觸發重繪
    }
}

3. 核心工具類 org.gjt.sp.jedit.textarea.Wallpaper

package org.gjt.sp.jedit.textarea;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Wallpaper {
    static BufferedImage pic;
    private static final String DEFAULT_IMG = "org/gjt/sp/jedit/icons/wallpaper.jpg";
    static AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f);
    static File lastSelectedFile;

    static {
        loadPic(ClassLoader.getSystemResourceAsStream(DEFAULT_IMG));
    }

    public static void paintWallpaper(Graphics2D g, int cx, int cy, int width, int height, JComponent view) {
        if (pic == null) return;
        Composite old = g.getComposite();
        g.setComposite(alpha);
        int w = pic.getWidth(), h = pic.getHeight();
        for (int y = 0; y < height; y += h) {
            for (int x = 0; x < width; x += w) {
                g.drawImage(pic, cx + x, cy + y, view);
            }
        }
        g.setComposite(old);
    }

    private static void loadPic(InputStream in) {
        try { pic = ImageIO.read(in); } 
        catch (IOException e) { e.printStackTrace(); }
    }

    public static boolean changeWallpaper(JComponent parent) {
        JFileChooser jfc = new JFileChooser(lastSelectedFile);
        if (jfc.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
            lastSelectedFile = jfc.getSelectedFile();
            try { loadPic(new FileInputStream(lastSelectedFile)); return true; }
            catch (IOException e) { e.printStackTrace(); }
        }
        return false;
    }
}

4. 資源與配置

  • 預設圖片置於 org/gjt/sp/jedit/icons/wallpaper.jpg (Jar 內資源路徑)。
  • actions.xml 註冊動作:<action name="change-wallpaper" class="org.gjt.sp.jedit.textarea.JEditTextArea" method="changeWallpaperDialog"/>。
  • jedit_gui.props 工具列加入按鈕:view.toolbar=... - change-wallpaper,圖示可復用 Help.png。

5. 建置與驗證

  1. 重新編譯專案 (Ant/Maven)。
  2. 重啟 jEdit,工具列出現「Change Wallpaper」按鈕。
  3. 點擊選擇圖片,編輯區即時顯示半透明平鋪背景。

效能與體驗權衡

作者誠實記錄:可能略微影響繪製效能(每幀需平鋪繪製圖片),但主觀體驗良好,「I like it :)」。現代硬體下影響可忽略,若極度在意可優化:VolatileImage 快取、僅重繪無效區域。

啟示

  • 開源專案二次開發:閱讀核心繪製流程,精準注入擴展點。
  • Swing 繪製機制:paintComponent、Graphics2D 合成、AlphaComposite 透明度控制。
  • 資源載入:ClassLoader.getSystemResourceAsStream 統一處理 Jar 內/外部資源。
  • 用戶偏好持久化:可擴展儲存 lastSelectedFile 路徑至 jEdit 設定檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved