首先吐槽一下坑爹的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.DispatchingBeanfbean 的注册
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.
那位大人有更好的方法请不吝分享,谢谢。
在Oracle Forms 9i中使用FBean注册Java VBean时遇到问题,无法直接获取IHandler来向Forms发送事件。解决办法是创建普通VBean类,通过触发器初始化并利用其与FBean交互,实现事件传递。
2620

被折叠的 条评论
为什么被折叠?



