Как я могу динамически добавлять текстовое поле после нажатия кнопки?

#java #button #wicket #textfield

#java #кнопка #калитка #текстовое поле

Вопрос:

Кто-нибудь может указать мне здесь правильное направление. Я хочу, чтобы изначально было, скажем, 2 текстовых поля, тогда пользователь сможет нажать кнопку «Добавить», и будут отображены еще 2 текстовых поля (это должно быть динамичным, поскольку пользователь может щелкнуть один или 100 раз, например)

Комментарии:

1. вероятно, вам следует повторно пометить свой вопрос или, по крайней мере, сказать, о каком языке кодирования вы говорите

Ответ №1:

Поскольку это wicket, это должна быть Java… Я бы переназначил это, но для этого моя учетная запись является новой…

Поместите ваши исходные модели текстовых полей в один объект-оболочку и добавьте его в список (таким образом, содержащий только один элемент) и отобразите этот список в ListView. В событии onClick вашей кнопки добавьте еще один из этих объектов-оболочек в свой список и обновите ListView.

Что-то вроде

 public class TwoTextFields {
    private IModel textFieldOne;
    private IModel textFieldTwo;

    [... constructor, getters setters here  ...]
  

и

 public class MyPanel extends Panel {

   private List<TwoTextFields> list = new ArrayList<TwoTextFields>();

   public MyPanel(String id) {
       super(id);
       add( New ListView<TwoTextFields>("list", list) {

           @Override
           protected populateItem(Item<TwoTextFields> item) {
               add( new TextField("fieldOne", new PropertyModel(item, "textFieldOne");
               add( new TextField("fieldTwo", new PropertyModel(item, "textFieldTwo");
           }
      });
      add( new Button("button) {

           @Override
           protected void onClick() {
               list.add(new TwoTextFields());
           }
      });
}
  

Я не знаю, компилируется ли это… Это просто для того, чтобы дать вам идею, я не хотел запускать eclipse для этого…

Комментарии:

1. Это позволило бы перезагрузить страницу вместо обновления через Ajax, что могло бы быть чище. Должно сработать, хотя 🙂

2. Почему вспомогательный класс TwoTextFields использует экземпляры IModel в качестве своих свойств, а не просто String?

3. @jbrookover: да, этот пример не имеет ajaxified, но поскольку в wicket это просто шаблон, а приведенный пример — это всего лишь пример, а не самостоятельное решение, я подумал, что этого будет достаточно

4. @ireddick: Две причины…. a) таким образом, вы можете использовать тот же код для добавления флажков и любого другого элемента формы, который вам нравится, просто добавив некоторые общие элементы в оболочку. б) Текстовые поля Wicket могут содержать гораздо больше, чем просто строки. Используя модель, вы можете легко получить доступ к возможностям преобразования wicket, чтобы использовать эти поля также для чисел и т.д.

5. спасибо за пример кода, который натолкнул меня на хорошую идею. Спасибо!