Лучший способ создания подкласса JPanel в Swing
Вопрос
В настоящее время я пытаюсь создать расширяющуюся панель в Swing (аналогичную WPF Expander
control), и я хотел бы сохранить обычные методы управления им (i.e. setLayout
, add
, и т.д.).Только они должны быть перенаправлены на встроенную панель (ту, которая отображается или скрыта).
Как бы это сделать?Переопределение каждого метода JComponent
и перенаправить это на встроенный JPanel
было бы громоздко, но это единственный способ, который я вижу.
Или я должен скорее сделать встроенную панель видимой снаружи и заставить пользователей использовать что-то вроде ExpanderPanel.getInnerPanel()
вместо этого.Но тогда это не прямая замена JPanel
который, я думаю, было бы неплохо иметь.
Решение
В версии 1.5 (ish) Swing перенаправил несколько методов на панель контента в JFrame
, JApplet
и т. д. Хотя для тех, кто только начинает работать, появились некоторые преимущества юзабилити , это на самом деле не решает проблему. Таким образом, каждый должен иметь дело с очень странным поведением API. Поэтому я советую избегать такого подхода.
Другие советы
Посмотрите на JXTaskPane из проекта Swingx . Он уже делает то, что вам нужно.
Если у вас есть виджет контейнера, который содержит панель, которую вы хотите показать и скрыть, почему бы не расположить вашу внутреннюю панель так, как вы хотите, затем добавить ее на панель контейнера, а затем использовать статические методы для контейнера, чтобы сказать
JPanel p = новая JPanel();//сделайте что-нибудь с JPanel...
ContainerWidget.setContent(p) Контейнерный виджет.setContent(p);
ContainerWidget.expandPanel(p, true);
Сработает ли что-нибудь подобное этому?