Компонент в JPanel исчез автоматически

У меня есть JPanel и Jlist, когда пользователь выбирает другой элемент в списке, соответствующий компонент будет добавлен на панель, а предыдущий компонент будет удален. Вот часть кода:

depictorPanel.removeAll();
depictorPanel.invalidate();
depictorPanel.repaint();
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
depictorPanel.add(viewer, constraints);
viewer.setSize(depictorPanel.getSize());
depictorPanel.invalidate();
depictorPanel.repaint();

где DeppicorPanel — это JPanel, а вьюер — это компонент (кстати, вьюер имеет тип VisualizationView из библиотеки JUNG, которая также наследует JPanel).

Когда я изменяю размер JPanel (выполняется путем изменения размера всего окна, так что все компоненты в окне изменяются), или сворачиваю окно и восстанавливаю его, компонент средства просмотра исчезает, я могу сказать, поскольку я устанавливаю разные цвета фона для DescriberPanel и средство просмотра.

Я также обработал прослушиватель componentResized в DescriberPanel, чтобы аннулировать и перерисовать средство просмотра, но безуспешно.


person Weixiang Guan    schedule 26.09.2013    source источник
comment
Чтобы получить помощь и быстрее опубликовать SSCCE   -  person Reimeus    schedule 26.09.2013
comment
Есть две другие стратегии, которые вы могли бы использовать. 1) Если viewer часто показывается с разными деталями, вместо этого просто используйте один viewer, но обновляйте детали. 2) Если viewer может также быть editor или generalSettings (т. е. ограниченное (менее 50) количество определенных компонентов), используйте CardLayout.   -  person Andrew Thompson    schedule 27.09.2013
comment
@AndrewThompson Спасибо за альтернативы! Вы правы, я думаю, что лучше использовать один просмотрщик, но с разными деталями. Использование CardLayout не является предпочтительным, поскольку различные отображаемые графики могут быть любыми (большими) числами. Кроме того, я все еще хочу знать, почему мой текущий код не работает.   -  person Weixiang Guan    schedule 27.09.2013
comment
Я все еще хочу знать, почему мой текущий код не работает. Те, кто является экспертом в этом вопросе, возможно, все еще ждут этого SSCCE, как советует @Reimeus. ;)   -  person Andrew Thompson    schedule 27.09.2013
comment
@ЭндрюТомпсон Хорошо. Мне интересно, почему в настоящее время многие люди рекомендуют SSCCE вместо того, чтобы публиковать ответы прямо здесь. В таком случае переводим ли мы платформу на SSCCE? Тогда stackoverflow будет непригоден для использования.   -  person Weixiang Guan    schedule 27.09.2013
comment
SSCCE вместо того, чтобы публиковать ответы прямо здесь. А? Учитывая, что SSCCE (если он существует) предполагается быть размещенным непосредственно здесь - как редактирование вопроса, этот набор слов читается как ерунда (для меня). Можете ли вы объяснить это по-другому? Кстати, обычно мне очень полезно добавить SSCCE в мои собственные вопросы, чтобы я мог поручиться за этот совет из личного опыта (полностью отдельно от автора документа .. ;)).   -  person Andrew Thompson    schedule 27.09.2013
comment
@AndrewThompson Хорошо, я понимаю, вы имеете в виду, что я могу опубликовать свой код в SSCCE и добавить ссылку в свой вопрос, чтобы люди могли опробовать код напрямую, верно? Я отмечаю это, я буду использовать это в своих будущих вопросах. Спасибо.   -  person Weixiang Guan    schedule 27.09.2013
comment
@WeixiangGuan Нет, вы должны прочитать, что такое SSCEE (не платформа): sscce.org   -  person sdasdadas    schedule 27.09.2013
comment
@sdasdadas Наконец-то я это понял! SSCCE означает, что я должен опубликовать программу, которая соответствует SSCC в моем вопросе! Поскольку требования указаны на другом веб-сайте, я ошибся с концепцией.   -  person Weixiang Guan    schedule 28.09.2013


Ответы (2)


Наконец-то я нашел рабочий метод, использующий менеджер компоновки (GridBagLayout):

GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 1;
constraints.weighty = 1;
depictorPanel.add(currentViewer, constraints);
depictorPanel.revalidate();

Этот код делает эффект, который я ожидал. Я думаю, что моя проблема заключалась в том, что я плохо понимал каждого отдельного менеджера компоновки (поскольку я относительно новичок в Java).

Спасибо всем, ребята! Я узнаю кое-что о Java с помощью этого вопроса (и SSCCE) :-)

person Weixiang Guan    schedule 28.09.2013

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

person Weixiang Guan    schedule 27.09.2013
comment
Я нашел обходной путь для своей проблемы.. Обходной путь создаст 10 новых проблем. Графические интерфейсы Java могут работать на нескольких платформах, с разными разрешениями экрана и с использованием разных PLAF. Как таковые они не способствуют точному размещению компонентов. Чтобы организовать компоненты для надежного графического интерфейса, вместо этого используйте менеджеры компоновки или их их комбинации, а также отступы и границы макета для пробел. - person Andrew Thompson; 27.09.2013
comment
@AndrewThompson Я понимаю, что вы имеете в виду, я действительно хотел бы использовать менеджеры компоновки, если они работают! Но, как я слышал, Java должен быть скомпилирован один раз и запущен где угодно, поэтому я предполагаю, что что бы я ни делал, если код работает здесь, он должен работать и там. - person Weixiang Guan; 28.09.2013
comment
Предполагается, что Java скомпилируется один раз и будет работать где угодно. Слышали, как люди в критике говорят, что вместо этого Java «компилируется один раз, тестируется везде». Вы, кажется, не понимаете, что «менеджеры компоновки» являются способом Java обеспечить философию «компилировать один раз, запускать где угодно» с компоновкой компонентов, в то время как null менеджер компоновки .. наоборот, сломается на разных реализациях. Вы должны попытаться выяснить, как предоставить графический интерфейс, показанный в этом ответе, без использования макета. Это показывает силу их использования. - person Andrew Thompson; 28.09.2013