プラグイン作って覚えたことを淡々と記録するよ(GUI編その3)

間を開けすぎると忘れてしまうなぁ...

RawCommandLineEditor

それなりに便利なUIパーツ。


上図のような外観(キャプションは別)を持ち,右端のアイコンをクリックすると,下図のようなダイアログが表示される。


名前からもわかるように,コマンドライン・オプションみたいな眺めの文字列を入力するのに便利なテキストフィールド。ダイアログのエディタ部分に入力した改行はスペースとして扱われるので,RawCommandLineEditor#getText()で得られる文字列に改行が含まれることはないってワケ。


用途は限定されると思うが,それなりに便利。なお,ダイアログのキャプションは,RawCommandLineEditor#setDialodCaption(String)で設定できる(UIデザイナのプロパティにも dialodCaptionってのがあるんで,UIデザイナからも設定可)。
...ということを今気付いたんで,あとでWinstoneプラグインにも設定しておく。

AddDeleteListPanel

これも名前のまんまな外観を持つUIパーツで,こんなの。


なんのヒネリもないが,あたしみたいにSwing慣れしてない人が,テキストフィールド以外のUIを作らないといけない場合なんかは便利。
おそらく,一番簡単な使い方はこう(AddDeleteListPanelはデフォルトコンストラクタがないので,createUIComponents()中に初期化しないとダメ)。

private void createUIComponents() {
    addDeleteListPanel1 = new AddDeleteListPanel("Add Delete ListPanel", new ArrayList()) {
        protected Object findItemToAdd() {
            String value = Messages.showInputDialog(this, "何か入力してください", "Input Dialog", null);
            return value != null && !"".equals(value) ? value : null;
        }
    };
}

ボタン(Add/Delete)のキャプションを変えたい場合は,こんなコードになる。

private void createUIComponents() {
    addDeleteListPanel1 = new AddDeleteListPanel("Add Delete ListPanel", new ArrayList()) {
        protected void initPanel() {
            super.initPanel();
            myAddButton.setText("Add...");
        }
        protected Object findItemToAdd() {
            String value = Messages.showInputDialog(this, "何か入力してください", "Input Dialog", null);
            return value != null && !"".equals(value) ? value : null;
        }
    };
}

こんだけでもリストに対する追加と削除ができる。ただし,変更はできない。たぶん,AddDeleteListPanelが内包しているDefaultListModelにListDataListener貼っ付けろってことなんだろうけど,そこまでは実装していない。:-P


ついで言えば,AddDeleteListPanelの親クラスは,PanelWithButtonsって言うんだが,こいつ継承すれば「左側にパネル,右側にボタン群」みたいなUIパーツが作れるようだ。ただ,そんだけのために,わざわざPanelWithButtonsを継承する利点が思い浮かばないんだけどね。

ダイアログについて

AddDeleteListPanelのコード例に,さりげなく(↓)こんな

String value = Messages.showInputDialog(this, "何か入力してください", "Input Dialog", null);

コードがあったのに気付いたろうか?


いくらあたしがSwingに疎いと言っても,Javaでダイアログっていやぁ,JOptionPaneを使うくらいは知っている。んが,JOptionPaneが作るダイアログは,どうにもIDEAとしっくり来ないようで,ファイル・チューザ同様,ダイアログもIDEA専用のが用意されている。それが,Messagesクラスっていうワケ。


Messagesにどんだけダイアログ生成APIがあるかは,プラグインSDKJavadocで確認してもらうとして,JOptionPaneとの違いだけを紹介しとく(といっても,極端な違いはないよ)。


SwingのJOptionPaneが作ったのダイアログ


IDEAのMessagesが作ったダイアログ


ん...まぁ,キモチの問題だな。:-)

CollapsiblePanel

そのなのとおり,折りたたみするパネル。これは,たまたま見つけただけで,有用かどうかって言われるとビミョーなので,説明もテキトー。


縮んでるとき

広がってるとき

コード例

private void createUIComponents() {
    collapsiblePanel1 = new CollapsiblePanel(new TestPanel(), true, true,
                                             IconLoader.findIcon("/actions/collapsePanel.png"),
                                             IconLoader.findIcon("/actions/expandPanel.png"),
                                             "Collapsible Panel");
}
Notification Popup

エラーとか起きたときに,画面右下からせり上がってくるアレ。


これは,UIパーツではなくてAPIで作るようで,なんか適当な処理中に,こんなコードを書くだけで良い。

WindowManager.getInstance()
             .getStatusBar(project)
             .fireNotificationPopup(
                 new MultiLineLabel("色は匂へど 散りぬるを?n我が世誰そ 常ならむ"),
                 Color.YELLOW);

fireNotificationPopup()は,第一引数にJComponentを受け取るんで,そこにNotification Popupに表示したいパーツを与えればいい。