2016-02-25 6 views
2

У меня есть JDialog, для которого я установил модель как модель меньше. Но теперь мне нужно изменить его модальность, пока она видна. Но я знаю, что Swing не позволяет изменять модальность диалога, пока он виден. Итак, есть ли другие трюки или код, которые могут это сделать?Как изменить модальность диалога, пока он виден

+0

Возможно, нет такого трюка, кроме того, что говорит JavaDoc, т. Е. Скрывает и снова показывает диалог. Главный вопрос: почему вы хотите это сделать? Разве вы не знаете модальность перед отображением диалога? Как пользователь должен обрабатывать диалоговое окно, которое скрыто каким-либо окном (возможно, модально также), когда оно внезапно становится модальным? – Thomas

+0

@Thomas, На самом деле я попал в ситуацию, когда у меня есть диалог с одним текстовым полем. Я установил фокус по умолчанию для этого текстового поля. Но, когда мой диалог модальный, он работает нормально. Но, когда мой диалог не имеет значения, фокус не попадает в текстовое поле автоматически после открытия диалогового окна –

+0

Так что проблема заключается в том, что диалог не получает или не теряет фокус? Я бы работал над этим, вместо того, чтобы сделать диалог модальным. – Thomas

ответ

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().

+0

Выполняет ли 'repaint()' оценку 'Dialog.modalityType'? – Thomas

+1

Я не понимаю, почему этот ответ так возвышен. 'Repaint()' не влияет на изменение модальности диалога. – Timmos

+0

Вы даже не можете вызвать 'revalidate()' в JDialog. Люди вслепую выживают или что? – Timmos

 Смежные вопросы

  • Нет связанных вопросов^_^