Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在GWT按钮旁边放一个JavaScript按钮吗?_Java_Javascript_Gwt_Jsni - Fatal编程技术网

我可以在GWT按钮旁边放一个JavaScript按钮吗?

我可以在GWT按钮旁边放一个JavaScript按钮吗?,java,javascript,gwt,jsni,Java,Javascript,Gwt,Jsni,是否可以创建一个带有两个按钮的水平面板,一个在GWT中,一个在JavaScript中 例如,我有一个对象: HorizontalPanel panelHeader = new HorizontalPanel(); Button buttonexample = new Button(); 现在,我用按钮创建了一个.js文件: function javascriptbutton(){ document.write('<input type="button" name="try" v

是否可以创建一个带有两个按钮的水平面板,一个在
GWT
中,一个在
JavaScript

例如,我有一个对象:

HorizontalPanel panelHeader = new HorizontalPanel();

Button buttonexample = new Button();
现在,我用按钮创建了一个
.js
文件:

function javascriptbutton(){
    document.write('<input type="button" name="try" value="try">');
}

我的问题是:如何添加在水平面板上包含按钮的
jsni
方法?通常对于
GWT
,我会使用
panelheadr.add(button)
,但是如何使用
javascript
按钮呢?

您必须将JS与HTML分开

在GWT中创建两个按钮。为需要外部JavaScript的按钮分配id。将单击处理程序附加到按钮,并从此单击处理程序调用本机JS:

myButton.getElement().setId("jsButton");
myButton.addClickHandler(new ClickHandler() {

    @Override
    public void onClick(ClickEvent event) {
        // Here you call your JSNI native method
        javascriptTest();
    }

});

在您的原生JS方法中,您可以通过其id引用此按钮。

在javascript中创建这样一个简单的类似于按钮的小部件并在GWT中使用应该是您最后的选择,而且很棘手,因为它可能会导致跨浏览器兼容性问题。此外,如果您必须调试该代码,这将很困难。无论如何,有一个更好的解决办法

您的自定义按钮应该是GWT小部件,以便将其添加到布局容器中。这意味着button类至少应该实现
IsWidget
,这允许添加按钮的布局容器调用
asWidget
方法,并返回一个简单的按钮包装容器,允许您轻松地布局按钮。下面的示例使用SimplePanel作为包装器

public class MyTextButton implements IsWidget, HasClickHandlers
{
    private SimplePanel panel = new SimplePanel();
    private Button button;
    public MyTextButton()
    {
        button = Button.create(panel.getElement());
    }

    @Override
    public Widget asWidget()
    {
        return panel;
    }
    //Use JavaScriptObject to create the DOM element for button which resides in the SimplePanel
    private static class Button extends JavaScriptObject
    {
        private static native Button create(Element parent)/*-{
            //create your javascript button here using parent element as the wrapper.
            //ex: if your function is correct
            //$wnd.javascriptbutton(parent);
        }-*/;
    }

    @Override
    public void fireEvent(GwtEvent<?> event)
    {
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler)
    {
        //bind this handler to native button's onClick, return the registration for removal, on remove you need to reset the onClick
        return null;
    }
}
public类MyTextButton实现IsWidget,hasClickHandler
{
私有SimplePanel=新SimplePanel();
私人按钮;
公共MyTextButton()
{
button=button.create(panel.getElement());
}
@凌驾
公共小部件asWidget()
{
返回面板;
}
//使用JavaScriptObject为位于SimplePanel中的button创建DOM元素
私有静态类按钮扩展了JavaScriptObject
{
专用静态本机按钮创建(元素父级)/*-{
//使用父元素作为包装器在此处创建javascript按钮。
//如果你的功能是正确的
//$wnd.javascriptbutton(父级);
}-*/;
}
@凌驾
公共无效火灾事件(GwtEvent事件)
{
}
@凌驾
公共句柄注册addClickHandler(ClickHandler处理程序)
{
//将此处理程序绑定到本机按钮的onClick,返回删除注册,在删除时需要重置onClick
返回null;
}
}


但理想情况下,
MyTextButton
类可以通过
UIObject
或任何其他特定类进行扩展,如果您想获得内置功能。

为什么?我只是好奇这是一个什么样的真实场景。我的场景是将旧javascript GUI的某些部分集成到一个新的GWT GUI中!!如此低的整合水平将令人头痛。可以导入一个奇怪的小部件,比如颜色选择器或日期选择器,但在js和gwt按钮级别混合和匹配可能不可行!!!请删除,因为它与此方法的内容重复,并且现在已过时。请注意,该方法不包含按钮,而是将按钮写入文档。这可能会使您很难扩展代码以添加更多小部件。
public class MyTextButton implements IsWidget, HasClickHandlers
{
    private SimplePanel panel = new SimplePanel();
    private Button button;
    public MyTextButton()
    {
        button = Button.create(panel.getElement());
    }

    @Override
    public Widget asWidget()
    {
        return panel;
    }
    //Use JavaScriptObject to create the DOM element for button which resides in the SimplePanel
    private static class Button extends JavaScriptObject
    {
        private static native Button create(Element parent)/*-{
            //create your javascript button here using parent element as the wrapper.
            //ex: if your function is correct
            //$wnd.javascriptbutton(parent);
        }-*/;
    }

    @Override
    public void fireEvent(GwtEvent<?> event)
    {
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler)
    {
        //bind this handler to native button's onClick, return the registration for removal, on remove you need to reset the onClick
        return null;
    }
}