Oracle Forms 9i+ 处理FBean 的事件

在Oracle Forms 9i中使用FBean注册Java VBean时遇到问题,无法直接获取IHandler来向Forms发送事件。解决办法是创建普通VBean类,通过触发器初始化并利用其与FBean交互,实现事件传递。


首先吐槽一下坑爹的Oracle forms

使用forms 的pjc 加强功能就要用 FBean 注册java VBean 类 但调用此类的方法时无法得到 IHandler 于是无法向Forms 发送事件。

这里我使用是间接方式。


1.  建立一个普通VBean 类


package tom.oracle.demos.dispatch;

/* DispatchingBean is a bean that will dispatch an event to forms
 * It will be called by the DispatchingPJC as an example
 * 
 * This method can be used to workaround that dispatching cannot
 * be done using PJCs
 * */

import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import oracle.forms.engine.Main;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.CustomEvent;
import oracle.forms.ui.VBean;
import oracle.forms.properties.ID;
import tom.oracle.demos.dispatch.DispatchingFBean;

public class DispatchingBean extends VBean
{private IHandler mHandler; 
 private Frame formsTopFrame   = null;
 private Main  formsMain       = null;
 private static final ID MYEVENT = ID.registerProperty("MYEVENT");
 private static final ID MYVALUE = ID.registerProperty("MYVALUE");
 private static final ID FINDCOMPS = ID.registerProperty("FINDCOMPS");

  public DispatchingBean()
  {
  }
  
public void init(IHandler handler)
{ 
mHandler = handler;
super.init(handler);
formsMain  = (Main) mHandler.getApplet();
formsTopFrame = formsMain.getFrame();
}

public boolean setProperty(ID id, Object value)
{   if(id == FINDCOMPS)
    {/* walkFindPJC will locate the DispatchingFBean & DispatchingPJC
      * and will set the dBean to this component
      * */

     walkFindPJC(formsTopFrame,0);
     return true;
    }
    
return super.setProperty(id,value);
}


public void dispatchanevent (String value)
{ // this is the method that will dispatch the customEvent to forms
 try{mHandler.setProperty(MYVALUE,value);
     CustomEvent ce = new CustomEvent(mHandler,MYEVENT);
     dispatchCustomEvent(ce);
    }
 catch (Exception e) 
       {System.out.println("exception while dispatching: " + e);
       }
}

protected void walkFindPJC(Component component, int iter)
{    if (component.getClass().getName().equals("tom.oracle.demos.dispatch.DispatchingFBean"))
     {DispatchingFBean DFBean = (DispatchingFBean)component;
      DFBean.dBean = this;
     }
     if (component.getClass().getName().equals("tom.oracle.demos.dispatch.DispatchingPJC"))
     {DispatchingPJC DPJC = (DispatchingPJC)component;
      DPJC.dBean = this;
     }
  if (component instanceof Container)
      { 
      Component components[] = ((Container)component).getComponents(); 
      iter++;
      for (int i = 0; i < components.length; i++)
          { if (components[i] != null)
               { walkFindPJC(components[i],iter);}
          }
       }
}

}

2. 你要使用的FBean 类

package tom.oracle.demos.dispatch;
 
import java.awt.event.*;
 
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import tom.oracle.demos.dispatch.DispatchingBean;
 
public class DispatchingFBean extends JPasswordField
{ public DispatchingBean dBean;
 
  public DispatchingFBean()
  {
  }
 
protected void processKeyEvent(KeyEvent e)
{ if (e.getKeyCode()==KeyEvent.VK_ENTER)
        {dBean.dispatchanevent("Enter is pressed");}
  super.processKeyEvent(e);
}   
}


3.  注册 Bean

普通 Bean 的 implementation class

tom.oracle.demos.dispatch.DispatchingBean
fbean 的注册


fbean.register_Bean('BEANS.DISPATCHINGFBEAN',1,'tom.oracle.demos.dispatch.DispatchingFBean');



4.  FMB 中 初始化trigger



fbean.register_Bean('BEANS.DISPATCHINGFBEAN',1,'tom.oracle.demos.dispatch.DispatchingFBean');
synchronize;
SET_CUSTOM_PROPERTY('BEANS.DISPATCHINGBEAN',1,'FINDCOMPS','dummyme');

5.  BeanArea 的 WHEN-IN-CUSTOM-EVENT 相应事件


Declare
  BeanValListHdl ParamList;
  paramType      Number;
  EventName      VarChar2(20);
  outputparam    varchar2(255);
Begin
  BeanValListHdl := get_parameter_list(:system.Custom_Item_Event_Parameters);
  EventName      := :SYSTEM.Custom_Item_Event;
  If (EventName = 'MYEVENT') then
    get_parameter_attr(BeanValListHdl,'MYVALUE',ParamType, outputparam);
    message ('Event value: ' || outputparam, no_acknowledge);
  End if;
End;



中心思想是用正常的bean的方法找到FBean 对象,

FBean 产生用户事件时调用 普通bean传送事件到Forms.


那位大人有更好的方法请不吝分享,谢谢。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值