jEdit 是成熟的 Java 程式編輯器,但原生不支援編輯區背景圖片。本文記錄如何通過修改原始碼(基於 jEdit 4.2 + JDK 1.4)實現編輯區背景圖片平鋪顯示,並提供圖片切換對話框、工具列按鈕一鍵切換。
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),實現「文字清晰可見、背景淡雅不干擾」。
org.gjt.sp.jedit.textarea.JEditTextArea.changeWallpaperDialog()public void changeWallpaperDialog() {
if (Wallpaper.changeWallpaper(this)) {
repaint(); // 觸發重繪
}
}
org.gjt.sp.jedit.textarea.Wallpaperpackage 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;
}
}
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。作者誠實記錄:可能略微影響繪製效能(每幀需平鋪繪製圖片),但主觀體驗良好,「I like it :)」。現代硬體下影響可忽略,若極度在意可優化:VolatileImage 快取、僅重繪無效區域。
paintComponent、Graphics2D 合成、AlphaComposite 透明度控制。ClassLoader.getSystemResourceAsStream 統一處理 Jar 內/外部資源。lastSelectedFile 路徑至 jEdit 設定檔。