2012-03-23 2 views
0

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

Ниже мой 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> 

Вот как файл, который назван 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, чтобы получить результат для показа в консоли.

Дайте мне руку plz.Thanks заранее.

+0

ждет ответа после первого щелчка. –

ответ

1

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

+0

Я думаю несколько разумный.thx –

0

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

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){....} 

* EDIT *

из вашего основного кода вы вызываете команду 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)

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

+0

Я новичок. Так что же должна быть функция обратного вызова? И какова функция функции обратного вызова? На мой взгляд, возможно, это может быть только функция setter, которая передает значение. Это правильно? –

+0

Я отредактировал свой ответ ... надеюсь, что эта помощь ... – Marcx

Смежные вопросы