2012-06-05 3 views
0

У меня есть группа панелей, помещенная в CardLayout где n th панель зависит от изменений состояния, вызванных (n - 1) th panel. Поскольку с CardLayout, вы должны инициализировать и добавить все панели заранее. Таким образом, это затрудняет управление государством.Lazy-initialization enabled CardLayout?

Является ли Java или какая-либо сторонняя библиотека с открытым исходным кодом вариацией CardLayout, которая инициализирует свои составляющие панели лениво, то есть они инициализируются незадолго до того, как они будут видны?

Edit:

Возможно, я не сформулируем проблему ясно. Дай мне попробовать снова.

I необходимо установить для установки панелей в CardLayout заранее, но я не хочу, чтобы он инициализировал их, пока они не станут видимыми. Это необходимо, чтобы изменения состояния с предыдущих этапов были прозрачно распространены на следующие этапы.

В моем текущем коде, у меня есть:

cardsPanel.add(ReadMePanel.create(this), ReadMePanel.ID); 
cardsPanel.add(LicencePanel.create(this), LicencePanel.ID); 
cardsPanel.add(InstallationPathPanel.create(this), InstallationPathPanel.ID); 
cardsPanel.add(
    ExtractionProgressPanel.create(
    this, 
    new NormalizedPath(appContext.getParameter("zipFilePath")), 
    new NormalizedPath(appContext.getInstallationDirectory().toString()) 
), 
    ExtractionProgressPanel.ID 
); 

Здесь InstallationPathPanel позволяет пользователям выбрать другой каталог для установки, чем по умолчанию. ExtractionProgressPanel должен извлечь определенный файл zip в этот каталог. если ExtractionProgressPanel были лениво инициализированы, выбранный пользователем путь будет распространен на него, без каких-либо дополнительных действий.

Надеюсь, что проблема понятна.

+1

«Поскольку с помощью« CardLayout »вы должны предварительно инициализировать и добавить * все * панели заранее». Кто сказал так? –

+0

Я сильно второй, что утверждает Эндрю. При использовании CardLayout такого требования нет. –

+0

Извините за неправильное указание проблемы. Точка акцента изменилась. Надеюсь, что это разъяснит. – missingfaktor

ответ

3

Вы можете инициализировать и добавить панель в CardLayout прямо перед вызовом метода show, поэтому проблем нет.

EDIT

Итак, на том месте, где вы сейчас называем CardLayout#show, вы могли бы сначала сделать add, а затем show

Как это выглядит, как вы пытаетесь создать мастера, в following article мощь быть хорошим местом для начала

+0

Проверьте правильность. – missingfaktor

+0

@missingfaktor Я вижу ваше редактирование и до сих пор не понимаю, почему вы не можете использовать это решение. – Robin

+0

Я никогда не называю «CardLayout # show». У меня есть панель с 'CardLayout' как ее' LayoutManager'. – missingfaktor