Как создать новый объект в GWT по строке имя-класса? - PullRequest
0 голосов
/ 09 мая 2019

Моя цель - создать гибкое приложение-> расширить функциональность моего веб-приложения. Я только добавить позицию в базу данных и загрузить недостающий класс на сервер.

Я создал динамическое менюв Java-GWT.Я использую MenuBar () и циклы, все позиции, которые были взяты из db (массив, строка).Конечно, 'end-option' в меню должен что-то делать, обычно после нажатия открывается приложение, т. Е. FlowPanel с кнопками, метками, текстовыми областями.

Моя идея заключалась в том, чтобы: с помощью отражения java добавить команду для всех позиций в меню,Каждая команда принимает имя параметра (строка), имя совпадает с именем класса -> далее, после нажатия я автоматически создаю объект.К сожалению, Java Reflection не работает с GWT, поэтому этот способ невозможен.

Мой вопрос:

Как создать объект, если у меня есть имя класса в строке?Или, если моя идея не верна, может быть, другой способ создать гибкое меню / программу?

1 Ответ

0 голосов
/ 17 мая 2019

Я думаю, я нашел небольшое решение для этой проблемы, но с другой концепцией - только один класс (и один интерфейс); в этом классе у меня есть один основной метод, который выбирает правильный метод открытия; в этом примере я проверяю по 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--;
        }

    }
}

Это не закончено, но вы можете показать основную идею. Если мне понадобится добавить новые опции в меню, я обновлю базу данных и заменил один класс для версии большим количеством методов.

...