Как отключить контейнер и его дочерние элементы в Swing

Согласно @Data description вы можете использовать:

Все созданные геттеры и сеттеры будут общедоступными. Чтобы переопределить уровень доступа, аннотируйте поле или класс с явной аннотацией @Setter и / или @Getter. Вы также можете использовать эту аннотацию (объединив ее с AccessLevel.NONE), чтобы подавить генератор и / или сеттер вообще.

blockquote>

16
задан Diodeus - James MacFarlane 18 December 2008 в 21:42
поделиться

4 ответа

Для добавления к ответ mmyers отключение детей не является легкой задачей (см. этот поток )

проблема близко к неразрешимому в общем случае. Вот почему это не часть базового Swing.

Технически, disable-and-store-old-state, сопровождаемый enable-and-restore-to-old-state, мог бы выглядеть привлекательным. Это даже могло бы быть хорошее, чтобы в особых случаях. Но существуют (по крайней мере, вероятно, набор больше) две проблемы с этим.

Составные компоненты

рекурсия должна остановиться на "составном компоненте" (или "единственный объект"). Тогда компонент ответственен за хранение состояния зависимого. Нет никакого общего способа обнаружить такой компонент - примерами является JComboBox, JXDatePicker (который, как связано выпуск )

Для создания вещей еще более сложными, зависимые не должны находиться под иерархией "составного компонента", f.i. JXTable заботится о ColumnControl (и заголовок) включил состояние.

Попытка заняться обоими потребовала бы для имения

a) свойство на составном объекте: "не касайтесь моих детей" и
b) свойство на неограниченных зависимых: "не касайтесь меня"

Привязка к включенному

, enable-and-update-to-old мог бы повредить состояние приложения, если включенное состояние связывается с (представление или другой) свойство модели и то свойство, измененное тем временем - теперь, старое состояние недопустимо.

Попытка заняться, который потребовал бы для имения

c), "реальное" stored-old-enabled-due-to-view-concerns свойство
d) связывает свойство модели представления и с включенным и с stored-old-enabled

JXRadioGroup, имеет вариант той проблемы: При отключении - самой группе или общем контроллере - отслеживает старо-поддерживающую из каждой кнопки. Кнопка включила, управляется Действием - если существует Действие. Таким образом, включенный контроллер должен восстановить к старо-поддерживающему, или к действию включил. Во время группы отключил (поскольку-группа), проблема вырисовывается, если Действие включило, была ложь при хранении и измененный на истинный. Другой, если действия добавляются.

Теперь воображают сложность изменений состояния при перегрузке a) - d)

13
ответ дан Community 18 December 2008 в 21:42
поделиться

JXLayer мог бы быть тем, что Вы ищете, согласно это сообщение :

Обертка Ваш контейнер с JXLayer и вызовом JXLayer.setLocked(true) после этого - все компоненты внутри будут отключены

сопроводительный текст http://www.java.net/download/javadesktop/blogs/alexfromsun/2007.06.25/LayerDemo.PNG

12
ответ дан VonC 18 December 2008 в 21:42
поделиться

Это то, что я придумал.

Component[] comps = myPanel.getComponents();
for (Component comp:comps){
    comp.setEnabled(false);
}
0
ответ дан 30 November 2019 в 21:03
поделиться

Как ответил VonC, простого решения не существует. Поэтому я рекомендую вам с самого начала программировать с помощью вспомогательной инфраструктуры.

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

class ControlledActionListener extends ActionListener {
    ...
    public void actionPerformed( ActionEvent e ) {
        if( !container.isEnabled() ) return;

        doYourBusinessHere();
    }
}

Или даже лучше, вы можете использовать APT для автоматического введите шаблонный код за вас.

Это всегда хорошо работает. Это чистый способ блокировать как взаимодействие с пользователем, так и программные вызовы одним усилием. Несмотря на то, что для поддержки базовой функциональности вам потребуется несколько кодов, взамен вы получите простоту, удобство использования и стабильность.

PS. я хотел бы увидеть лучшее решение этой проблемы.

0
ответ дан 30 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: