Необходимо дважды щелкнуть кнопку Flex, чтобы получить результат RemoteObject. - PullRequest
0 голосов
/ 23 марта 2012

Я делаю проект с использованием Java + Flex. Я создал класс Java и использовал удаленный объект Flex для вызова метода. Когда я пишу весь код в mxml, он работает хорошо. Но когда я обертываю сценарий в файл as, появляется кое-что любопытное. Мне нужно дважды щелкнуть кнопку Flex, чтобы получить результат, возвращаемый удаленным объектом. Я думаю, что-то не так с моим файлом.

Ниже мой MXML:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx"
           minWidth="500" minHeight="600">
<fx:Declarations>
    <mx:RemoteObject id="Control" destination="Control" showBusyCursor="true" />
</fx:Declarations>

<fx:Script>
    <![CDATA[
        import com.wntime.ControlUtil;
        import mx.rpc.events.ResultEvent;

        private var resultOfCmd:String;
        private var cmdStr:String;
        private var ct:ControlUtil = new ControlUtil();

        /* invoke as method */
        private function test():void
        {
            cmdStr = cmdTxt.text;
            resultOfCmd = ct.exec(cmdStr);
            cmdConsole.text = resultOfCmd;
        }

        /*  */
        private function exec():void{
            cmdStr = cmdTxt.text;
            Control.execCmd(cmdStr);
            Control.addEventListener(ResultEvent.RESULT,execCmd_clickHandler);
        }

        private function execCmd_clickHandler(event:ResultEvent):void
        {
            cmdConsole.text = event.result.toString();

        }

        private function clearCmdConsole():void
        {
            cmdConsole.text = "";
        }

    ]]>
</fx:Script>

<s:Panel id="CmdPanel" x="70" y="50" width="501" height="350" title="Command Execute Panel">
    <s:RichText x="20" y="33" fontSize="14" text="Cmd:"/>
    <s:TextInput id="cmdTxt" x="60" y="30" width="239"/>
    <s:Button id="execCmd" x="312" y="30" width="68" label="execute" click="exec()"/>
    <s:Button x="400" y="30" label="CmdTest" click="test()"/>
    <s:TextArea id="cmdConsole" x="20" y="85" width="450" editable="false"/>
    <s:Button x="400" y="250" label="clear" click="clearCmdConsole()"/>
</s:Panel>
</s:Application>

Вот файл as с именем ControlUtil:

package com.wntime{
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;

public class ControlUtil
{
    private var cmd:String = null;
    private var result:String = null;
    private var roControl:RemoteObject = new RemoteObject();

    public function ControlUtil()
    {
        roControl.destination = "Control";
    }

    public function exec(_cmd:String):String{
        this.cmd = _cmd;
        roControl.execCmd(cmd);
        roControl.addEventListener(FaultEvent.FAULT, execCmd); 
        roControl.addEventListener(ResultEvent.RESULT, execCmd);
        return result;
    }

    public function execCmd(event:ResultEvent):void
    {
        setResult(event.result.toString());
    }

    public function setResult(_result:String):void
    {
        this.result = _result;
    }

    }
}

Если я нажму кнопку «Выполнить». Результат будет показан в консоли (текстовое поле) напрямую. Но мне нужно дважды щелкнуть по кнопке CmdTest, чтобы отобразить результат в консоли.

Дайте мне руку, плз. Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Это просто дикое предположение, но я думаю, что метод, который вы вызываете на стороне Java, возвращается быстрее, чем вы добавляете своих слушателей, поэтому никакой обработчик событий не вызывается. Во второй раз все слушатели на месте, и ваш звонок успешен. Попробуйте добавить своих слушателей, прежде чем вызывать удаленный метод.

0 голосов
/ 23 марта 2012

Ваш код имеет различные ошибки / проблемы, на мой взгляд, я бы сделал что-то вроде этого:

package com.wntime{
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.RemoteObject;

public class ControlUtil
{
    private var cmd:String = null;
    private var result:String = null;
    private var roControl:RemoteObject = new RemoteObject();
    // the callBack function is the function that is called when the 
    // remoteobject successfully or not complete the request... 
    // you can set as parameters anything you want...
    private var callBack:Function = null;
    public function ControlUtil()
    {
        roControl.destination = "Control";
    }

    public function exec(callBack:Function, _cmd:String):void{
        this.cmd = _cmd;
        this.callBack = callBack;
        roControl.addEventListener(FaultEvent.FAULT, errorCmd); 
        roControl.addEventListener(ResultEvent.RESULT, execCmd);
        roControl.execCmd(cmd);
    }

    private function execCmd(event:ResultEvent):void
    {           
        callBack(true,event.result.toString());
    }

    private function errorCmd(event:FaultEvent):void
    {
        callBack(false, event.error); // call the callBack function passing the value you need
    }  

}
}

функция callBack выглядит примерно так:

private function name(b:Boolean, s:String = null){....}

* РЕДАКТИРОВАТЬ *

из вашего основного кода вы вызываете команду exec ...

// function invoked when the button is clicked!
private function buttonClick():void
{
    var tmp:ControlUtil = new ControlUtil();
    //exec(callBack:Function, _cmd:String)
    //you pass the function as a reference so when the async request is terminated the function is invoked and you can parse the result....
    tmp.exec(getResult, "cmqString");
}

// callBack function for the method ControlUtil.exec
private function getResult(b:Boolean, result:String = ""):void
{
    if (b)
    {
       // the call returned correctly and the result variable contains the value.
    }
    else
    {
       // the call failed and the result variable contains the error
    }
}

И логическое, и результирующее значение возвращаются, потому что я указал его в ControlUtil при использовании callBack(true/false, result/error)

Вы можете создать функцию по своему усмотрению ...

...