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

Swing 圖標組件進階:JIcon 實現多狀態可視化交互

     編輯:Java 程式設計入門

Swing Icon 接口雖簡單(僅三方法),卻支撐起強大的圖標合成、裝飾、過濾與狀態管理能力。本文實戰開發 JIcon 組件,實現圖標列表循環顯示、鍵鼠交互切換、焦點高亮、模型-視圖分離,適用於日誌級別標識、表格狀態列、樹節點圖標等場景。附完整工具類庫(CompoundIcon、DecoratorIcon、FilterIcon)設計解析。

核心工具類庫設計

1. CompoundIcon:並排/疊加合成

  • 構造器:CompoundIcon(Icon icon1, Icon icon2, boolean horizontal)
  • 寬高取兩者最大/累加,繪製時按水平/垂直排列
  • 用途:將多個圖標放入單圖標組件(JLabel、JButton)

2. DecoratorIcon:裝飾器模式疊加

  • 構造器:DecoratorIcon(Icon base, Icon overlay, int vAlign, int hAlign)
  • 九宮格對齊:TOP/BOTTOM/CENTER × LEFT/RIGHT/CENTER
  • 尺寸以基礎圖標為準,先繪基礎再繪裝飾
  • 異常保護:裝飾圖標大於基礎圖標拋 IllegalArgumentException

3. FilterIcon:圖像濾鏡處理

  • 構造器:FilterIcon(Icon base, ImageFilter filter)
  • 構造時應用濾鏡緩存結果圖像,繪製直接畫緩存
  • 兼容 AWT ImageFilter 與 Java 2D BufferedImageFilter

JIcon 核心架構:模型-視圖分離

IconListModel 接口:擴展 Icon 的狀態模型

public interface IconListModel extends Icon {
    int getIconCount();
    int getCurrentIndex();
    Icon getIcon(int index);
    void setIcons(Icon[] icons);
    void addIcon(Icon icon);
    void removeIcon(Icon icon);
    void setCurrentIcon(int index);
    // ChangeListener 支持
    void addChangeListener(ChangeListener l);
    void removeChangeListener(ChangeListener l);
}
  • 內部維護 List 與 List
  • getIconWidth/Height() 返回列表最大尺寸(緩存)
  • paintIcon() 委派給當前索引圖標
  • 列表變更觸發 fireChangeEvent() 通知視圖重繪

JIcon 組件:可交互的多狀態視圖

public class JIcon extends JComponent implements
        ChangeListener, FocusListener, MouseListener, KeyListener { ... }
特性實現細節
默認邊框1px EmptyBorder,焦點時切換為藍色 LineBorder
焦點控制setFocusable(true),Java 1.4+ 用 isFocusable(),舊版用 isFocusTraversable()
鍵盤交互空格鍵 → nextIcon() 循環切換
鼠標交互點擊獲取焦點 → nextIcon();可擴展右鍵 prevIcon()
循環邏輯nextIcon():索引+1 取模;prevIcon():索引-1 取模
尺寸自適應模型變更觸發 resetSize() 更新 preferred/minimum size

使用範例

// 構建圖標列表:空框、勾選、叉號
Icon[] states = { new CheckBoxIcon(false), new CheckBoxIcon(true), new CheckBoxIcon(null) };
IconListModel model = new IconListModelImpl(states);

JIcon jicon = new JIcon(model);
jicon.setFocusable(true);
panel.add(jicon);

// 程序化切換
jicon.setCurrentIcon(1); // 顯示勾選狀態

擴展應用場景

  • 表格單元格渲染器:table.getColumn("status").setCellRenderer(new JIconRenderer(model))
  • 樹節點圖標:根據節點狀態動態切換圖標
  • 日誌查看器:ERROR=紅叉、WARN=黃感嘆、INFO=藍圈、DEBUG=灰點
  • 向導步驟指示器:未開始/進行中/已完成/錯誤 四狀態循環

核心設計模式應用

模式應用點
裝飾器DecoratorIcon、CompoundIcon、FilterIcon 透明包裝 Icon
觀察者IconListModel 發布 ChangeEvent,JIcon 訂閱重繪
狀態JIcon 委派給模型當前索引圖標渲染
組合CompoundIcon 遞歸組合任意深度圖標樹

JIcon 填補了 Swing 無原生多狀態圖標組件的空白,讓圖標不再是靜態裝飾,而成為可交互、可編程、可組合的狀態視圖單元。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved