Создание гиперссылки / HTML / «Пожалуйста, предложите» в цикле в GWT? - PullRequest
3 голосов
/ 28 июля 2010

Итак, мой вопрос заключается в следующем:

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

Сейчасво всем первом столбце текст должен быть кликабельным, то есть я должен иметь возможность добавлять обработчик кликов к значениям первого столбца (так как я должен загрузить другую таблицу после нажатия любого из значений текста первого столбца.)

Вопрос : Как я могу сгенерировать такие теги гиперссылки в цикле?Проблема возникает, когда я пытаюсь это сделать, поскольку я не знаю, как назвать их во время выполнения цикла, и использую ту же концепцию при добавлении ClickHandlers.

Должен ли я использовать для этой задачи что-то другое, кроме Гиперссылки.Пожалуйста, объясните, как?

Я очень ценю помощь в этом, так как я очень новый кодер GWT.

- Chirayu

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Я бы предложил использовать Anchor, более конкретно, через конструктор Anchor(java.lang.String text):

Создает якорь для скриптинга. href для anchor установлен в javascript:;, основываясь на ожидании того, что слушатели будут добавлены на якорь.

Таким образом, вы получите хороший код <a>, который по щелчку ничего не делает, но вы можете добавить к нему ClickHandler, например:

Anchor anchor = new Anchor("Click me!"); // At this point clicking it won't do a thing
anchor.addClickHandler(new ClickHandler() {
    @Override
    public void onClick (ClickEvent event){
        // Do something cool here
    }
});

// Insert the anchor into the table

Еще один совет: было бы лучше, если бы вы могли создать ClickHandler один раз, а затем добавить его к каждому Anchor вместо создания нового анонимного класса для каждого Anchor, который вы добавляете в таблицу (например, в приведенном выше примере) - в зависимости от количества строк это действительно может ускорить процесс.

2 голосов
/ 28 июля 2010

Использование гиперссылки, возможно, не лучший способ сделать что-то подобное, потому что вы не должны использовать ClickHandler с гиперссылкой.Гиперссылка устанавливает HistoryToken, и вы должны реагировать на изменение истории.
Я бы использовал метку и, возможно, стилизовал бы ее как обычную ссылку, если вы хотите иметь такой же внешний вид.(Я буду использовать метку в следующем примере, но вы можете изменить ее на гиперссылку, если хотите.)

Я бы создал класс, расширяющий метку.Этот класс будет иметь идентификатор, который вы установили в конструкторе.Вы бы отправили этот идентификатор на сервер, чтобы получить новый FlexTable.В конструкторе вы добавляете ClickHandler, который считывает поле id и отправляет его на сервер для получения нового FlexTable.

public class FlexTableLabel extends Label implements ClickHandler {
    int id=0;  
    public FlexTableLabel(String text, int id) {
        this.id=id;
        this.setText=text;
        this.addCickHandler(this);
    }

    public void onClick(ClickEvent event) {
        //sends the id to the server, of course you need to replace it with your 
        //service
        yourService.getNewFlexTable(this.id);
    }     
 }

В вашем цикле вы просто создадите объекты нового класса и дадите ему соответствующийпараметры (я предполагаю, что у вас есть ArrayList с результатом. Объекты в этом ArrayList будут иметь текст и идентификатор):

for(int i=0; i<result.size;i++) {
    FlexTable.setWidget(i,0, new FlexTableLabel(result.get(i).text, result.get(i).id);
}

Я надеюсь, что это даст вам хоть что-то для начала, если что-то все еще неясно, оставьтекомментарий, и я постараюсь помочь разобраться в этом.

Редактировать на основе Пост Чираю :

Трудно объяснить что-то подобное беззная ваше приложение.Я обычно реализую Singleton Pattern , чтобы получить конкретный виджет.Поэтому я хотел бы создать класс следующим образом:

public static YourPanel extends Panel {
    private static YourPanel instance=null;

    public static YourPanel getInstance() {
        if(instance==null) {
            instance=new YourPanel();
        }
        return instance;
    }
}

В вашем EntryPointClass у вас будет что-то вроде этого:

public class YourEntryClass extends EntryPoint {
    public void onModuleLoad() {
        RootPanel.get().add(YourPanel.getInstance());
    }
}

Теперь вы можете вызывать метод YourPanel.getInstance () вonSuccess () часть вашего сервиса для изменения содержимого панели:

yourService.getNewFlexTable(this.id, new AsyncCallback<ArrayList<String>>() {
    public void onSuccess(ArrayList<String> result) {
    For(int i=0;i<result.size;i++) {
            YourPanel.getInstance().add(result.get(i);
        } 
    }
});

Надеюсь, это поможет.Оставьте комментарий, если это не так.

Пример приложения
Пример запуска приложения
Пример исходного кода приложения

0 голосов
/ 30 июля 2010

НЕ ОТВЕТ ... больше звонка Крису и Игорю сверху, так как не может вместить столько слов в комментарии.

Привет @ Крис, один вопрос, еслиВы приходите, чтобы прочитать это снова (надеюсь) ... Я смущен одной вещью, поэтому я сделал, как вы объяснили выше, но теперь, если моя панель определена в моем классе EntryPoint, который имеет цикл for, заданныйВы выше ...

затем в другом классе FlexTablelabel, в части, где я добавляю сервисы, то есть onClick часть ... как я должен добавить вещи в мои панели, которые определены вкласс EntryPoint?

In,

public void onClick(ClickEvent event) {

        //sends the id to the server, of course you need to replace it with your 
        //service
        yourService.getNewFlexTable(this.id);
    }     
}

Как получить доступ к панелям, методам и т. д. из класса EntryPoint.Я знаю, что могу сделать EntrypointClass EC = new EntrypointClass(), но он не работает так, как предполагалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...