IntelliJ Platform Pluginの開発にて、ToolWindow上で、CellRendererを使ってテーブル(JBTable)の列に画像を表示してみた

前回、ToolWindow上にテーブル(JBTable)を表示してみました。
IntelliJ Platform Pluginの開発にて、ToolWindow上で、TextFieldの入力値に従って絞り込み可能なテーブル(JBTable)を表示してみた - メモ的な思考的な

今回は、テーブルの列に画像を表示できるかためしてみたので、メモを残します。

 
目次

 

環境

 
なお、ソースコードは前回の記事のものを引き続き使います。

 

表示する方法を調査

SwingのJTableにおける列の表示方法を調べたところ、以下の記事がありました。
JTable でのデータの表示方法を決める セルレンダラー - Swing の JTable の使い方 - Java の Swing を用いた GUI - Java 入門

上記記事では、セルレンダラーにより列の表示方法を決めていました。

そこで、IntelliJ Platform Plugin の場合も同じ方法で実現できるかもしれないと考え、ためしてみます。

 

実装

画像ファイルを resources/icons ディレクトリの中に置く

まずは描画する画像ファイルを配置します。

 
画像ファイルをどこに置くのが適切なのか、公式ドキュメントには見つかりませんでした。

そこで今回は、リソースっぽいファイルの置き場である resources/icons の中に shinanogold.png ファイルを置くことにしました。

 

ImageIcon で画像ファイルを参照するobjectの作成

続いて、画像ファイルを参照するobjectを作成します。

画像ファイルを参照できるようにする場合、kotlinでは ImageIcon クラスを使うのが良さそうでした。

そこで、 ui ディレクトリの中に AppleTableCellIcon objectを用意し、リソースディレクトリの中に置いたファイルを参照します。

package com.github.thinkami.hellojetbrainsplugin.ui

import javax.swing.ImageIcon

object AppleTableCellIcon {
    val ShinanoGold = ImageIcon(requireNotNull(javaClass.getResource("/icons/shinanogold.png")))
}

 

DefaultTableCellRenderer を継承したセルレンダラーを作成

今回は、3列目が の場合のみ、画像ファイルを表示してみます。

package com.github.thinkami.hellojetbrainsplugin.ui

import javax.swing.table.DefaultTableCellRenderer

class AppleTableCellRenderer: DefaultTableCellRenderer() {
    override fun setValue(value: Any?) {
        if (value == "黄") {
            // 黄色の場合だけ、シナノゴールドのアイコンに差し替える
            icon = AppleTableCellIcon.ShinanoGold
            text = ""
            return
        }

        icon = null
        text = value.toString()
    }
}

 

JBTableのcellRendererに、セルレンダラーを指定

今回は3列目に上記で作成したセルレンダラーを設定します。

row {
    val table = JBTable()
    table.model = appleTableModel
    table.columnModel.getColumn(2).cellRenderer = AppleTableCellRenderer()
    myTableModel = scrollCell(table)
}

 
以上で実装は完了です。

 

動作確認

Run Pluginしてみると、3列目が の値になっている場合のみ、画像が表示されました。

 
前回作成した絞り込み機能を使った場合でも、正しく動作しました。

 

ソースコード

Githubにあげました。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin

今回のプルリクはこちら。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin/pull/15