Чтение панели в макет после редактирования панели?

То, что я пытаюсь сделать, это динамически редактировать панель и читать ее в макете (Граница). Панель содержит текстовые поля, и я хочу, чтобы пользователь мог добавлять или удалять текстовые поля на панели. Я пробовал следующее: удалить панель из макета, добавить еще одно текстовое поле на панель, прочитать панель в макете. Однако это не работает (ничего не произошло, только панель была удалена, но не прочитана с новым текстовым полем, поэтому область была просто пустой). Даже когда я удалил панель из макета, а затем вместо этого добавил в макет другой компонент (BorderLayout.EAST); ничего не произошло (просто пусто).

Это часть кода, которая не работает:

vfields[blocks] = new TextField("0"); //add new textfield to the array of textfields
blocks    += 1;
dp.blocks = blocks;
this.remove(values_fields); //remove the values_fields panel from the borderlayout
values_fields.add(vfields[blocks]); //add new component,textfield to the panel
this.add(values_fields, BorderLayout.EAST); //readd the panel to the border layout<-- doesn't work

Я надеюсь, что кто-нибудь может мне помочь. Я относительно новичок в Java, поэтому я могу просто делать что-то совершенно неправильно или что-то в этом роде, но я сам этого не вижу.

Заранее спасибо!

Скайф.


person Skyfe    schedule 30.10.2010    source источник


Ответы (2)


Нет необходимости снимать всю панель. Вы можете просто удалить/добавить компоненты на существующую панель. В видимом графическом интерфейсе порядок кода будет следующим:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

Если вам нужна дополнительная помощь, разместите свой SSCCE.

person camickr    schedule 30.10.2010
comment
Привет, я попробовал, и это сработало для удаления компонентов с панели. Однако, когда я пытаюсь таким образом динамически добавлять компоненты на панель, это не работает. Работает: values_fields.remove(vfields[blocks-1]); значения_поля.валидировать(); значения_поля.перекрасить(); Не работает: values_fields.add(vfields[blocks]); значения_поля.валидировать(); значения_поля.перекрасить(); - person Skyfe; 31.10.2010
comment
Обновление: кажется, я получаю исключение Java NullPointerException в той части, где я использую метод добавления: values_fields.add(vfields[blocks]). Что не так? - person Skyfe; 31.10.2010
comment
Если это не работает при добавлении компонентов, возможно, это связано с тем, что вы используете менеджер компоновки, который требует от вас указания ограничений. Это произойдет, например, когда вы используете IDE для создания формы. В большинстве IDE используется GroupLayout, который требует указания нескольких ограничений. Мой совет — выгрузить IDE и написать формы самостоятельно, чтобы знать, как добавлять компоненты и как указывать требуемое ограничение. - person camickr; 31.10.2010
comment
Спасибо за ваш ответ, теперь у меня все работает; используя ваши методы. Я сделал глупую ошибку: я сослался на созданный мной объект ( vfields[blocks] ) так же, как я его создал (используя также значение блоков в качестве индекса), но между созданием объекта и его использованием я увеличил значение блоков, которые заставили его ссылаться на еще не существующий объект, поэтому я переместил увеличение блоков int после него, и теперь он работает. Большое спасибо! - person Skyfe; 31.10.2010

Похоже, перекрашивать уже некуда. Вы пытались вызвать следующие два метода после изменения графического интерфейса:

  validate();
  repaint();
person Prine    schedule 30.10.2010
comment
Да, когда я вызываю эти методы после изменения графического интерфейса, он все равно ничего не показывает. Как будто он только удалил панель value_fields из бордюра, так как она все еще пуста в этом месте. Есть идеи? - person Skyfe; 30.10.2010