У меня есть JDialog
, для которого я установил модель как модель меньше. Но теперь мне нужно изменить его модальность, пока она видна. Но я знаю, что Swing не позволяет изменять модальность диалога, пока он виден. Итак, есть ли другие трюки или код, которые могут это сделать?Как изменить модальность диалога, пока он виден
2
A
ответ
3
Просто выполните то, что говорит Javadoc ... скрыть и показать диалог.
Примечание: изменение модальности видимого диалогового окна может не повлиять, пока оно не будет скрыто, а затем снова показано.
Так вот рабочий пример:
public class ModalDialogTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
final JDialog dialog = new JDialog(frame);
dialog.setModal(true);
Runnable modalSwitcher = new Runnable() {
@Override
public void run() {
try {
System.out.println("Worker thread: sleeping for 5 seconds");
Thread.sleep(5000);
System.out.println("Worker thread: sleeping finished!");
} catch (InterruptedException ex) {
// this thread is not interrupted
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("ENTERING MODALSWITCHER!");
dialog.setModalityType(ModalityType.MODELESS);
dialog.setVisible(false);
dialog.setVisible(true);
System.out.println("NO LONGER MODAL!");
}
});
}
};
new Thread(modalSwitcher).start();
System.out.println("DIALOG WILL NOW SHOW UP:");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
dialog.setVisible(true);
System.out.println("BYE!");
}
});
}
}
Через 5 секунд, вы сможете нажать на родительском JFrame.
Это то, что программа печатает:
DIALOG WILL NOW SHOW UP:
Worker thread: sleeping for 5 seconds
Worker thread: sleeping finished!
ENTERING MODALSWITCHER!
NO LONGER MODAL!
BYE!
действительно ли вы хотите продолжить практику переключения модальности, показывая диалог до вас, но я не рекомендую это в перспективе пользователя опыт - он чувствует себя довольно странно.
-1
обновите диалоговое окно и позвоните по телефону repaint()
. Если вы изменили иерархию (добавленные/удаленные компоненты), не забудьте указать revalidate()
.
Возможно, нет такого трюка, кроме того, что говорит JavaDoc, т. Е. Скрывает и снова показывает диалог. Главный вопрос: почему вы хотите это сделать? Разве вы не знаете модальность перед отображением диалога? Как пользователь должен обрабатывать диалоговое окно, которое скрыто каким-либо окном (возможно, модально также), когда оно внезапно становится модальным? – Thomas
@Thomas, На самом деле я попал в ситуацию, когда у меня есть диалог с одним текстовым полем. Я установил фокус по умолчанию для этого текстового поля. Но, когда мой диалог модальный, он работает нормально. Но, когда мой диалог не имеет значения, фокус не попадает в текстовое поле автоматически после открытия диалогового окна –
Так что проблема заключается в том, что диалог не получает или не теряет фокус? Я бы работал над этим, вместо того, чтобы сделать диалог модальным. – Thomas