アクションを介してウィジェットを追加する方法に関する Geertjan のブログの例 ( https://blogs.oracle.com/geertjan/entry/add_widget_via_action_in )に基づいて、Netbean プラットフォーム 7.3 でプログラミングしているときに、非常に奇妙な問題が発生しています。
TopComponent を作成しましたが、カスタム ペインに画像をレンダリングするカスタム ScrollPane を表示したいと考えています。私のカスタム Scrollpane は、基本的な Java Swing アプリケーションでうまく機能しています。
テストするためだけに、TopComponentのコンストラクターにScrollpaneを表示しようとしました:
public TopComponent()
{
super();
setBackground( Color.BLUE );
initComponents();
setName( Bundle.CTL_Scanmage2TopComponent() );
setToolTipText( Bundle.HINT_Scanmage2TopComponent() );
setImage( ImageHandlerFactory.getImageHandler( new File( ... ) ));
}
ImageHandler
画像を記述する私のクラスであるsetImageメソッドがあります:
public void setImage( ImageHandler handler ) throws Exception
{
pane = new Scrollpane(); // pane is a class field of type : Scrollpane
pane.setImage( handler ); // thats OK, the tiled image is loaded, etc.
setLayout( new BorderLayout() );
add( pane , BorderLayout.CENTER , 0 );
pane.revalidate(); // does not work
pane.repaint(); // does not work
}
すべて問題ありません。netbeans アプリケーションが起動します。コンストラクターまたは componentOpened から setImage が呼び出された場合にのみ、画像がアプリケーションに適切に表示されます。
ここで、メニューから画像をロードし、インターフェイス、サービス プロバイダーを実装しましたが、すべて問題ありません。
メニュー アクションから、ルックアップを使用して、このアクションから生成された ImageHandler を介してイメージをロードするメソッドを持つすべてのオブジェクトを見つけます。
次に、setImage(...)
ルックアップを介して呼び出しても何も実行されません。私の TopComponent は何も表示することを絶対に拒否します。
を使用しようとしたためFlowLayout
、TopComponent の上部に小さなもの (約 3x3 ピクセル) が表示されました。
問題は、TopComponent にスクロールペイン (JScrollpane を拡張) を強制的に描画させるにはどうすればよいかということです。
再検証/検証/無効化/再描画/ ... TopComponent、Scrollpaneを試みましたが、方法がありません...
何か案が ?
ありがとう !
-- EDIT 1 / 再編集: 不要な部分を削除 --
Geertjan のアプリは問題なく動作しますが、ボタンのアクションから setImage メソッドを呼び出しても何も起こりません。
このボタンのコードは次のとおりです。
public void actionPerformed( ActionEvent e )
{
Lookup.Result<MyInterface > controllers = Lookup.getDefault().lookupResult( MyInterface .class );
Collection<? extends MyInterface > controllersColl = controllers.allInstances();
for( MyInterface c : controllersColl )
{
c.setImage( imgH ); // debug shows it passes heres and expected internal job is done
}
}
すべてがうまくいっているように見え、オブジェクトが作成されますが、GUI では何も表示されません。
-- EDIT 2 / 再編集: 不要な部分を削除 --
-- 編集 3 / Tan Hui Onn の回答後 --
実際、Tan Hui Onn に感謝します。「TopComponent の別のインスタンスを取得するだけです」。
使用するTopComponent.getRegistry().getActivated()
と機能します。