2010-08-30 1 views
1

[Этот вопрос в отношении this question]Блока всего свинг пользовательского интерфейс для одного компонента, кроме - «диалога в стиле»

Установки: У меня есть этот дом обработанных «редактируемый ярлык» компонент, который выглядит как ярлык, но когда вы нажимаете на нее, она превращается в редактируемое поле, позволяющее редактировать его. Вы можете нажать Esc, чтобы отменить, или Shift-Enter в OK ваши изменения - или щелкните соответствующие кнопки под редактируемым полем.

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

+0

Это просто поразило меня тем, что Стеклянная панель и JXLayer могут сосать события. Поэтому, если я использую стеклянную панель или JXLayer, чтобы пробить визуальное отверстие в белом слое, чтобы сделать «белое», что связано с связанным с ним вопросом, я могу просто одновременно не допускать события на белых частях - только на " ударил "части .. – stolsvik

ответ

2

Стеклянная панель может быть путем. Вы можете легко украсть все события и отправить их на свой пользовательский объект. Вот статья, в которой обсуждается способ реализации A wellbehaved glasspane.

1

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

  • Построить интерфейс EditableLabelListener, определяющего метод editableStateChanged(EditableLabelEvent)

  • Создать EditableLabelEvent класс, который расширяет AWTEvent и добавляет editableState свойства и isEditable() логического значения.

  • Добавить методы пользовательского компонента для addEditableLabelListener и removeEditableLabelListener

  • На каждой панели, где вы используете свой компонент, иметь свой класс контроллера (который может быть вашей панели, в зависимости от дизайна) осуществлять EditableEventListener и зарегистрировать себя как слушатель компонента.

  • Когда событие запущено, класс контроллера должен проверить метод isEditable на событие и включить или отключить все остальные компоненты на панели, если это необходимо. Когда в одной форме есть несколько редактируемых компонентов ярлыков, вы можете использовать метод getSource для события, чтобы определить, какой из них используется, чтобы вы могли отключить другие.

0

Вы можете продлить JDialog, то при инициализации его,

this.setAlwaysOnTop(true); 
this.setModalityType(ModalityType.APPLICATION_MODAL); 
this.setVisible(false); 
this.setVisible(true); 

Это только позволит JDialog быть взаимодействовали с и блокировать все остальное в приложении.

1

В редактируемом ярлыке, когда вы начинаете редактирование, используйте SwingUtilities.getRoot(), чтобы получить корень вашей метки, нанесите его на Container. В контейнере вы можете позвонить getComponents(). Перейдите через этот массив и вызовите setEnabled(false), если это не метка. Включите их, когда вы закончите редактирование.

Один вопрос: зачем он нужен? Если вам требуется диалоговое поведение, используйте JOptionPane.

BTW, если вы удаляете границу с JTextField и setOpaque (false), это будет как редактируемый ярлык.