0

アクションを介してウィジェットを追加する方法に関する 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()と機能します。

4

1 に答える 1