如何通过字符串class-name在GWT中创建新对象



我的目标是创建一个灵活的应用程序 ->以扩展我的Web应用程序的功能,我只是在数据库中添加一个位置并将缺失的类上传到服务器中。p>我在Java-GWT中创建了动态菜单。我使用Menubar((和循环,所有位置,wchich均取自DB(阵列,字符串(。当然,菜单中的"选项"必须做某事,通常在单击应用程序后,即带有按钮,标签,textareas的Flowpanel。

我的想法是:使用Java反射添加菜单中所有位置的命令。每个命令以选项(字符串(的名称,名称是相同的,例如类的名称 ->接下来,单击后,我将自动创建对象。不幸的是Java反射不适合GWT,因此不可能。

我的问题是:

当我在字符串中具有类名时,如何创建对象?或者,如果我的想法错了,Maybye是创建灵活菜单/程序的其他方法?

我的东西,我为这个问题找到了一个小解决方案,但是有了另一个概念 - 只有一个类(和一个接口(;在此类中,我有一种主要方法,它可以选择正确的"打开方法";在此示例中,我通过INT检查:

/ -----------------------------------------------------------------------------------/程序主要部分中的示例循环:>/(...(

MenuBar menu = new MenuBar(true);
    for (int k = 0; k < 5; k++) {
            int ii=k;
            menu.addItem(tekst + k, new Command() {
                @Override
                public void execute() {
                    ClassMetodInterface metoda = (ClassMetodInterface) GWT.create(Method2.class);
                    vPanel.clear(); //clearing before I open a new widget.
/*I sent int (easier to tests), but I can sent string[i] too*/
/* logging - instance of main class to communicate with 'subclasses', in my project necessery*/
                    vPanel.add(metoda.defaultMethod(ii, logging));  
                }
            });
        }
(...)
/*-------------------------------------------*/
ClassMetodInterface, only for implementation class Method2 :
/*-------------------------------------------*/
    public interface ClassMetodInterface {
    Widget defaultMethod(int g, Logging logging);
}
/*-------------------------------------------*/
class Method2 with swich:
/*-------------------------------------------*/

public class Method2 implements ClassMetodInterface {
    public Widget zapisUsera(int g, Logging logging) {
        Logging logging;
        HorizontalPanel lPanel = new HorizontalPanel();
        switch(g) {
        case 1: {
            Window.alert("switch for test no:"+g);
            MenuWindow1(logging);
            break;
        }
        case 2:{
            Window.alert("switch for test no:"+g);
            break;
        }
        default:
            Window.alert("switch default - loop >2 && <1");
            break;
        }
        return lPanel;  //all methods will be void - they will be add widgets and Panels to lPanel
    }
    public Widget MenuWindow1(Logging logging) {
        this.logging = logging;
        lPanel.setBorderWidth(2);
        this.lPanel.setPixelSize(100, 50); 
        Button b1 = new Button("test button, not used");    
        lPanel.add(b1);
        Label lbl = new Label("label no "+logging.i);       
        lPanel.add(lbl);
        Button addGlobal = new Button("+");
        Button removeGlobal = new Button("-");
        lPanel.add(addGlobal);
        addGlobal.addClickHandler(new addGlobal());
        removeGlobal.addClickHandler(new removeGlobal());
        lPanel.add(removeGlobal);

        return lPanel;
    }
//for tests communication with class, where I have menu and global variable
    public class addGlobal implements ClickHandler {
        @Override
        public void onClick(ClickEvent event) {
            logging.i++;
        }
    }
    public class removeGlobal implements ClickHandler {
        @Override
        public void onClick(ClickEvent event) {
            logging.i--;
        }
    }
}

尚未完成,但是您可以显示主要想法。如果我需要在菜单中添加新选项,我将更新DB,并使用更多方法替换一个版本。

相关内容

  • 没有找到相关文章

最新更新