IntelliJ IDEAプラグイン開発。 パート7

この部分では、ユーザーインターフェイスコンポーネント。 前の部分はこちらです。




IntelliJ IDEAには、多数のカスタムSwingコンポーネントが含まれています。 プラグインでこれらのコンポーネントを使用すると、IDEのユーザーインターフェイスの他の部分と調和して表示および動作し、多くの場合、標準のSwingコンポーネントを使用する場合に比べてコードサイズを削減できます。



メニューとツールバー



メニューとツールバー(ツールバー)は、アクションのシステムを使用して構築されます( 2番目のパートで既に説明したとおり)。



ツールウィンドウ



ツールウィンドウは、メインのIntelliJ IDEAウィンドウの左、下、および右に表示されるパネルです。 両側には、プライマリとセカンダリの2つのグループのツールウィンドウがあり、同時にアクティブにできるグループは1つだけです。



各ツールウィンドウには、複数のタブ(APIでは「コンテンツ」と呼ばれる)を含めることができます。 たとえば、ツールウィンドウの「実行」にはアクティブな起動構成ごとにタブが表示され、「変更」にはプロジェクトで使用されているバージョン管理システムに応じて固定されたタブのセットが表示されます。



プラグインでツールウィンドウを使用するには、主に2つのシナリオがあります。 最初のシナリオ(たとえば、AntおよびCommanderプラグインで使用)では、ツールウィンドウボタンが常に表示されるため、ユーザーはいつでもプラグイン機能をアクティブにして対話できます。 2番目のシナリオ(「依存関係の分析」アクションで使用)では、特定の操作の結果を表示するツールウィンドウが作成され、操作の完了後すぐにユーザーが閉じることができます。



最初のシナリオでは、ウィンドウは、拡張ポイントを使用してplugin.xmlファイルに登録されます
<<toolWindow>>
      
      



設定。 拡張ポイント属性には、ツールウィンドウボタンの表示に使用されるデータが含まれます。



これに加えて、 ToolWindowFactoryインターフェイスを実装するファクトリクラスを(属性「factoryClass」で)指定する必要があります。 ユーザーがツールウィンドウボタンをクリックすると、createToolWindowContent()メソッドが呼び出され、ユーザーインターフェイスが初期化されます。 この手順により、未使用のツールウィンドウがメモリ使用量や起動時間にオーバーヘッドを引き起こさないことが保証されます。ユーザーがプラグインのツールウィンドウを操作しない場合、コードはダウンロードも実行もされません。



ツールウィンドウがすべてのタイプのプロジェクトに必要なわけではない場合、Conditionインターフェースを実装するクラスの完全修飾名を含むオプション属性conditionClassを指定できます(これはファクトリーを実装するクラスと同じかもしれません)。 value()メソッドがfalseを返す場合、ツールウィンドウは表示されません。 条件は、プロジェクトをロードするときに一度だけ計算されることに注意してください。 プロジェクトでの作業中にツールウィンドウを動的に表示および非表示にする場合は、ツールウィンドウの登録に2番目のスクリプトを使用する必要があります。



構成例
 <extensions defaultExtensionNs="com.intellij"> <toolWindow id="My Sample Tool Window" icon="/myPackage/icon.png" anchor="right" factoryClass="myPackage.MyToolWindowFactory" /> </extensions>
      
      





2番目のシナリオは、プラグインコードからのToolWindowManager .registerToolWindow()メソッドへの通常の呼び出しで構成されます。 このメソッドには、タスクに応じて使用できるオーバーロードがいくつかあります。 Swingコンポーネントを受け入れるオーバーロードを使用すると、ツールウィンドウに表示される最初のタブになります。



多くのツールウィンドウのコンテンツを表示するには、インデックスにアクセスする必要があります。 このため、インデックスの作成時にウィンドウはオフになりますが、canWorkInDumbModeパラメーターの値としてregisterToolWindow()関数に「true」を渡すと、ウィンドウはアクティブのままになります。



前述のように、ツールウィンドウには複数のタブを含めることができます。 ウィンドウのコンテンツを管理するには、 ToolWindow .getContentManager()を呼び出します。 タブ(「コンテンツ」)を追加するには、まずContentManager .getFactory()。CreateContent()を呼び出して作成し、次にContentManager.addContent()を使用してツールウィンドウに追加する必要があります。



ユーザーがタブを閉じることをグローバルに許可するか、個別に許可するかを決定できます。 後者は、registerToolWindow()関数のcanCloseContentsパラメーターを定義するか、または
 <canCloseContents="true">
      
      



plugin.xmlファイル内。 タブを閉じることがグローバルに有効になっている場合でも、呼び出すことで特定のタブに対して無効にすることができます
 <Content.setCloseable(false)>
      
      







対話



DialogWrapper -IntelliJ IDEAプラグインで使用されるすべてのモーダル(および一部の非モーダル)ダイアログボックスの基本クラスです。 次の機能を提供します。



独自のダイアログボックスにDialogWrapperクラスを使用する場合、次のことを行う必要があります。



DialogWrapperクラスは、多くの場合、UI Designerフォームと組み合わせて使用​​されます。 フォームとDialogWrapperを拡張するクラスをバインドするには、フォームのルートパネルをフィールドにバインドし、createCenterPanel()メソッドから返します。



ダイアログボックスを表示するには、show()メソッドを呼び出してからgetExitCode()メソッドを使用して、ダイアログボックスが閉じられた方法を確認します。



ダイアログボックスに表示されるボタンを構成する(つまり、[OK]、[キャンセル]、[ヘルプ]ボタンの標準セットを置き換える)には、createActions()またはcreateLeftActions()メソッドをオーバーライドできます。 これらのメソッドは両方とも、Swing Actionオブジェクトの配列を返します。 追加したボタンがダイアログボックスを閉じる場合、DialogWrapperExitActionをアクションの基本クラスとして使用できます。



ダイアログボックスに入力されたデータを確認するには、doValidate()メソッドをオーバーライドできます。 このメソッドはタイマーによって自動的に呼び出されます。 現在入力されているデータが有効な場合は、nullを返す必要があります。 それ以外の場合は、エラーメッセージをカプセル化するValidationInfoオブジェクトと、オプションで無効なデータに関連付けられたコンポーネントを返します。 コンポーネントを指定すると、エラーアイコンがその横に表示され、ユーザーが[OK]をクリックしようとするとフォーカスが移ります。



ポップアップ



IntelliJ IDEAのユーザーインターフェイスは、ポップアップを明示的に使用します。明示的な閉じるボタンがなく、フォーカスが失われると自動的に消えるセミモーダルウィンドウです。 プラグインでこれらのコントロールを使用すると、プラグインと統合開発環境の残りの部分との間に単一のユーザーインターフェイスが提供されます。



ポップアップにはタイトルを付けることができ、必要に応じて移動したり、サイズ変更を許可したり(サイズがサポートされていることを忘れないでください)、ネストしたりできます(アイテムが選択されたときに追加のポップアップを表示できます)。



JBPopupFactoryインターフェースを使用すると、特定のニーズに応じて、さまざまな種類のSwingコンポーネントを表示するポップアップを作成できます。 最も一般的に使用される方法は次のとおりです。



アクショングループのポップアップは、通常の矢印キーに加えて、キーボードを使用してアクションを選択するさまざまな方法をサポートしています。 定数の1つの値をActionSelectionAid列挙に渡すことにより、シリアル番号に対応する数字キーを押すか、テキストの一部を入力する(高速検索)か、ニーモニックシンボルを押すことでアクションを選択できるかどうかを選択できます。 一連の要素が固定されたポップアップの場合、シリアル番号の付け方を選択することをお勧めします。 変数と潜在的に多数の要素を持つポップアップの場合-通常、高速検索が最適です。



リストポップアップダイアログを作成する必要があるが、通常のJListが適していない場合-たとえば、アクションをグループにグループ化することは望ましくない場合、 ListPopupStepインターフェイスとJBPopupFactory.createListPopup()メソッドを直接操作できます。 通常、インターフェイス全体を実装する必要はなく、代わりにBaseListPopupStepクラスから継承できます。 オーバーライドの主なメソッドは、getTextFor()(要素に表示されるテキストを返す)およびonChosen()(要素が選択されたときに呼び出されます)です。 onChosen()メソッドから新しいPopupStepを返すことにより、階層(ネスト)ポップアップを実装できます。



ウィンドウを作成したら、いずれかのshow()メソッドを呼び出してウィンドウを表示する必要があります。 IntelliJ IDEAにshowInBestPositionFor()を呼び出してコンテキストに基づいて位置を自動的に選択させるか、showUnderneathOf()やshowInCenterOf()などのメソッドで位置を明示的に指定できます。 show()メソッドは、ポップアップが閉じるのを待つのではなく、すぐに制御を返すことに注意してください。 ウィンドウを閉じるときにアクションを実行する必要がある場合は、addListener()メソッドを使用してリスナーをウィンドウにバインドできます。 またはPopupStep.onChosen()などのメソッドをオーバーライドします。 または、ポップアップ内の対応するコンポーネントにイベントハンドラを添付します。



通知



最新のIntelliJ IDEAバージョンの設計指針の1つは、モーダルウィンドウを使用して、ユーザーに注意が必要なエラーやその他の状況を通知しないようにすることです。 代わりに、IntelliJ IDEAはいくつかのモードレス通知タイプの選択肢を提供します。



対話


モーダルダイアログボックスを使用する場合、[OK]ボタンをクリックして入力データを確認し、別のモーダルウィンドウで無効なデータをユーザーに通知する代わりに、前述のDialogBu​​ilder.doValidate()メソッドを使用することをお勧めします。



エディターのヒント


エディターから呼び出されるアクション(リファクタリング、ナビゲーションなど)の場合、アクションを実行できないことをユーザーに通知する最良の方法は、 HintManagerクラスを使用することです 。 そのshowErrorHint()メソッドは、ユーザーがエディターで別のアクションを開始すると自動的に非表示になるエディターの上にフローティングウィンドウを表示します。 他のHintManagerメソッドを使用して、エディターの上にヒントの形式で他のタイプのモードレス通知を表示できます。



高レベルの通知


モードレス通知を表示する最も一般的な方法は、 Notificationsクラスを使用することです。 主に2つの利点があります。



通知の表示に使用される主なメソッドはNotifications.Bus.notify()です。 通知テキストにはHTMLタグが含まれる場合があります。 ハイパーリンクを含め、NotificationListenerのインスタンスをNotificationクラスのコンストラクターに渡すことで、ユーザーが通知と対話できるようにすることができます。



NoticationコンストラクターのGroupDisplayIdパラメーターは、通知のタイプを示します。 ユーザーは、[設定]で各通知の種類に対応するディスプレイの種類を選択できます| 通知。 希望するタイプを示すには、通知を表示する前にNotifications.Bus.register()を呼び出す必要があります。



クラスとファイルの選択



ファイル選択


ユーザーがファイル、ディレクトリ、または複数のファイルを選択できるようにするには、 FileChooser .chooseFiles()メソッドを使用します。 このメソッドにはいくつかのオーバーロードがあり、そのうちの1つはvoidを返し、選択したファイルのリストをパラメーターとして受け取るコールバック関数を受け取ります。 これは、Mac OS Xでネイティブダイアログボックスを表示する唯一のオーバーロードです。



FileChooserDescriptorクラスを使用すると、選択できるファイルを制御できます。 デザイナーのオプションにより、ファイルやディレクトリを選択できるかどうか、および複数のアイテムを許可するかどうかが決まります。 より正確に制御するために、isFileSelectable()メソッドをオーバーロードできます。 FileChooserDescriptorクラスのgetIcon()、getName()、およびgetComment()メソッドをオーバーライドすることにより、ファイルの表示をカスタマイズすることもできます。 ネイティブMac OS Xファイル選択ダイアログではほとんどの設定がサポートされていないため、それらに依存する場合は、chooseFiles()メソッドオーバーロードを使用する必要があります。これにより、標準のIntelliJ IDEAダイアログボックスが表示されます。



ファイルを選択する非常に一般的な方法は、テキストボックスを使用して省略記号(「...」)を使用してパスを入力し、ファイル選択ダイアログを表示することです。 このようなコントロールを作成するには、 TextFieldWithBrowseButtonコンポーネントを使用し、そのaddBrowseFolderListener()メソッドを呼び出してファイルピッカーを構成します。 追加のボーナスとして、これにより、テキストボックスに手動でパスを入力するときにファイル名を自動補完できるようになります。



ファイルを名前で検索する必要がある場合に理想的な、ファイルを選択するための代替UIは、 TreeFileChooserFactoryクラスから利用できます。 このAPIで使用されるダイアログボックスには2つのタブがあります。1つはプロジェクトの構造を示し、もう1つはGoto Fileで使用されるファイルと同様のファイルのリストを示します。 ダイアログボックスを表示するには、createFileChooser()から返されたオブジェクトでshowDialog()を呼び出し、次にgetSelectedFile()を呼び出してカスタム選択を取得します。



クラスとパッケージの選択


Javaクラスを選択するオプションをユーザーに提供する場合は、 TreeClassChooserFactoryクラスを使用できます。 そのさまざまなメソッドを使用すると、特定のクラスまたはインターフェイス実装の子孫に選択を制限するために検索範囲を指定したり、リストから内部クラスを含めたり除外したりできます。



Javaパッケージを選択するには、 PackageChooserDialogクラスを使用できます。



エディターのコンポーネント



Swing JTextAreaと比較して、IntelliJ IDEAエディターコンポーネントには、構文の強調表示、コード補完、コードの折りたたみなど、多くの利点があります。 IntelliJ IDEAのエディターは通常エディタータブとして表示されますが、ダイアログボックスまたはツールウィンドウに埋め込むことができます。 これにより、 EditorTextFieldコンポーネントが許可されます。



EditorTextFieldを作成するときに、次の属性を指定できます。



EditorTextFieldの一般的な使用例の1つは、Javaクラスまたはパッケージの名前を編集することです。 これは、次の手順を使用して実現できます。



リストとツリー



JBListとツリー


JListの標準Swingコンポーネントを使用する予定がある場合は、JBListの代替を使用することを検討してください。



JBListのように、標準のJTreeクラスの代替を提供するクラスcom.intellij.ui.treeStructure.Treeがあります。 JBList機能に加えて、Macスタイルのレンダリングとドラッグアンドドロップの自動スクロールをサポートしています。



ColoredListCellRendererおよびColoredTreeCellRenderer


コンボボックスまたはツリー内の項目の表示をカスタマイズする必要がある場合、セルをレンダリングする手段としてColoredListCellRendererクラスまたはColoredTreeCellRendererクラスを使用することをお勧めします。 これらのクラスを使用すると、さまざまな属性を持つテキストの複数のフラグメントからビューを収集し(append()を呼び出す)、要素に追加のアイコンを適用する(setIcon()を呼び出す)ことができます。 視覚化システムは、選択された要素と他の多くのプラットフォーム固有のレンダリングの詳細に対して正しいテキスト色を自動的に設定します。



ListSpeedSearchおよびTreeSpeedSearch


リストまたはツリーでキーボードを使用してアイテムを選択しやすくするために、クイック検索ハンドラーをそれらに適用できます。 これは簡単な呼び出しで実行できます。
 <new ListSpeedSeach(list)>
      
      



または
 <new TreeSpeedSearch(tree)>
      
      



。 アイテムの検索に使用されるテキストをカスタマイズする必要がある場合は、getElementText()メソッドをオーバーライドできます。 さらに、要素を文字列に変換する関数を渡すことができます(ListSpeedSearchコンストラクターのelementTextDelegateとして、またはTreeSpeedSearchコンストラクターのtoString()メソッドとして)。



ツールバー装飾


プラグインを開発する際の非常に一般的なタスクは、ユーザーがアイテムを追加、削除、編集、または並べ替えることができるリストまたはツリーを表示することです。 このタスクは、 ToolbarDecoratorクラスによって非常に容易になります。 このクラスには、アイテムに関連付けられたアクションを備えたツールバーが含まれ、基になるリストモデルをサポートしている場合、リスト内のアイテムの順序を自動的にドラッグアンドドロップできます。 ツールバーの位置(リストの上または下)は、IntelliJ IDEAが実行されているプラ​​ットフォームによって異なります。



ツールバーデコレータを使用するには:



その他のSwingコンポーネント



メッセージ


Messagesクラスは、単純なメッセージ、入力ダイアログ(テキストフィールドのあるモーダルダイアログ)、および選択ダイアログ(リストのあるモーダルダイアログ)を表示する方法を提供します。さまざまなクラスメソッドの機能は、その名前から明確でなければなりません。Mac OS Xで起動すると、メッセージボックスはネイティブインターフェイスを使用します。



showCheckboxMessageDialog()関数は、「今後これを表示しない」チェックボックスを実装する簡単な方法を提供します。



必要に応じて、モーダルメッセージボックスの代わりに非モーダル通知を使用することをお勧めします。前のセクションのいずれかで通知を確認しました。



jbsplitter


JBSplitterクラスは、標準のJSplitPaneクラスの代替です。他の改良されたJetBrains Swingコンポーネントとは異なり、これは同等の代替品ではありません。異なるAPIがあります。ただし、ユーザーインターフェイスの均一性を実現するには、標準のJSplitPaneではなくJBSplitterを使用することをお勧めします。

コンポーネントをセパレータに追加するには、setFirstComponent()およびsetSecondComponent()メソッドを呼び出します。



JBSplitterは、自動アスペクト比保存をサポートしています。有効にするには、setSplitterProportionKey()メソッドを呼び出して、比率を保存する識別子を渡します。



Jbtabs


JBTabs JetBrains, . look & feel, Swing Mac OS X, , .



...


サイクルのすべての記事: 1、2、3、4、5、6、7



All Articles