0

次のようなアクションスクリプトでキャンバスを作成しています:

private var cvs_preview:Canvas = null;

            private function show_preview():void
            {                               
                this.cvs_preview = new Canvas();        
                this.cvs_preview.id = "cvs_preview_1";      
                this.cvs_preview.setStyle('backgroundColor', 0x000000);
                this.cvs_preview.setStyle('backgroundAlpha', 1);
                this.cvs_preview.setStyle('borderColor', 0x417FDD);
                this.cvs_preview.setStyle('cornerRadius', 10);
                this.cvs_preview.setStyle('borderStyle', 'solid');
                this.cvs_preview.setStyle('dropShadowEnabled', true);
                var pt:Point = image.localToGlobal(new Point(image.x, image.y));                
                this.cvs_preview.x = pt.x - 50;
                this.cvs_preview.y = pt.y - 50;
                this.cvs_preview.height = 200;
                this.cvs_preview.width = 250; 
                //this.cvs_preview.addEventListener(FlexEvent.CREATION_COMPLETE, get_focus_on_canvas);
                //this.cvs_preview.focusManager.setFocus(
                //this.cvs_preview.addEventListener(MouseEvent.CLICK, end_preview_on_focus_change);
                this.cvs_preview.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, end_preview_on_focus_change);
Application.application.addChild(this.cvs_preview); //add as top-most visible container

                btn_mini_preview.enabled = false;

            }

したがって、フォーカスの変更時に「end_preview_on_focus_change()」を実行したい

しかし、これは機能していません。

私の理解では、そもそもキャンバスに焦点が合っていないと思います。キャンバスの作成が完了した後、 focusManager.setFocus を使用してそれを実行しようとしていました。それでもエラーが発生します。

Creation.Complete で試していたコードは次のとおりです。

private function get_focus_on_canvas(e:FlexEvent)
            {
                focusManager.setFocus(e.target);
                //Alert.show("testing img complete");
            }

これにより、「1118: 関連付けられていない可能性のある型 mx.managers:IFocusManagerComponent への静的型 Object を持つ値の暗黙の強制」というエラーが表示されます。

基本的に、キャンバスのフォーカスアウトイベントを使いたいだけです。

誰かがこれを手伝ってくれますか...私は長い間この問題に取り組んできました。

よろしくジーシャン

4

4 に答える 4

2

エラーは正しいです。Objectとして使用しようとしているタイプのオブジェクトがありますIFocusManagerComponent。これは機能しません。そのコード行を達成するには、次のようなことをする必要があります

focusManager.setFocus( IFocusManagerComponent( e.target ) );

もちろん、これはターゲットが を実装していることを前提としていますIFocusManagerComponent。それ以外の場合は、エラーが発生します (この場合Canvasは、IFocusManagerComponent としてリストされていないため、エラーが発生する可能性があります)。良いニュースは、同じことを達成Canvasする方法があることです。drawFocus

あなたのMOUSE_FOCUS_CHANGEイベントに関しては、オブジェクトがすでにフォーカスを持っていて、それを失った場合にのみ発生します。を使ったほうがいいと思いますFlexEvent.CREATION_COMPLETE。これにより、コンポーネントが Flex SDK のすべての適切なクラスに登録され、FocusManager が新しいオブジェクトを認識できるようになります。何をするにしても、まだステージに追加されていないもの (つまり、Event.ADDED が呼び出されたもの) にフォーカスを設定しようとしないでください。

別のアドバイスとして、Event.ADDED バブルについてevent.currentTarget == event.targetは、正しいオブジェクトをリッスンしていることを確認してください。そうしないと、同じ関数を誤って複数回呼び出している可能性があります。

于 2009-12-17T18:22:16.523 に答える
2

IFocusManagerComponent他の人が述べたように実装するクラスはごくわずかCanvasであり、それらの1つではありません。本当に呼び出す必要がFocusManager.setFocus()ある場合は、キャンバス クラスを拡張してこのインターフェイスを実装し、代わりにそのクラスを使用する必要があります。このインターフェースを実装するためにメソッドを記述する必要はありません。すべてのメソッドはすでにUIComponent単独で実装されています。

//FocusableCanvas.as (include appropriate package and import statements)
public class FocusableCanvas extends Canvas implements IFocusManagerComponent
{
    public function FocusableCanvas()
    {
        super();
    }
}

//Now use this class instead of Canvas
this.cvs_preview = new FocusableCanvas();


//setFocus in creation complete handler
FocusManager.setFocus(IFocusManagerComponent(e.target));

ただし、作成時にキャンバスにフォーカスを設定することだけが必要な場合は、代わりにハンドラーcanvas.setFocus()から呼び出すことができます。creationComplete

private function get_focus_on_canvas(e:FlexEvent)
{
    Canvas(e.currentTarget).setFocus();
    trace("done");
}
于 2009-12-18T07:28:58.733 に答える
1

2 つの問題があり、完全な解決策はありません。運が良ければ、これはあなたを助けることができます。

まず、e.target は Object 型で型キャストされたオブジェクトを返します。Object は IFocusManagerComponent を実装していないため、これは暗黙の強制エラーを説明しています。

次に、iFocusManagerComponent は、Flex 3.4 AS3 リファレンスのこのエントリに従って、Accordion、AdvancedListBase、Button、ButtonBar、ChartBase、ComboBase、DateChooser、DateField、HTML、ListBase、MenuBar、NumericStepper、TabNavigator、TextArea、TextInput、UIMovieClip によってのみ実装されます。

これにより、Canvas 要素はフォーカスを取得できず、UIComponent の継承を通じて FocusManager へのアクセスを継承しただけだと思われます。

私が見ることができる唯一の解決策は、Canvas 以外のものを利用してフォーカス関連の問題を処理するか、Canvas をサブクラス化して iFocusManagerComponent を実装することですが、それはかなり複雑に見えます。

上記のソリューションで drawFocus が欠落していることに対するお詫びを編集します。

于 2009-12-16T21:04:53.413 に答える
-1

してみてください;

private function get_focus_on_canvas(e:FlexEvent)
{
    this.cvs_preview.setFocus();
}
于 2013-06-09T15:06:39.490 に答える