2013-04-17 1 views
2

Я хочу, чтобы отобразить JDialog поэтому я использую это:Сфокусируйтесь на JDialog, используя SwingUtilities.invokeLater?

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { new DialogBox().setVisible(true); } 
}); 

Он отлично работает, чтобы отобразить его, но тогда мой JDialog не держать в центре внимания, что он должен (пользователь не должен быть в состоянии работать используя основной интерфейс, когда этот диалог открыт).

Можно ли избавиться от SwingUtilities.invokeLater()?

О, и в соответствии с this question нецелесообразно расширять JDialog или JFrame, почему? Так я всегда это делал.

+0

Не вы просто хотите модальный диалог? –

+0

Расширение JDialog или JFrame сводится к дизайну. Какую функциональность вы фактически добавляете в эти контейнеры верхнего уровня? Здесь также следует учитывать, что если вы создаете пользовательский интерфейс непосредственно над одним из этих контейнеров верхнего уровня, вы в будущем ограничиваете использование своих компонентов интерфейса. Лучше расширить что-то вроде JPanel, постройте свой пользовательский интерфейс поверх этого, предоставив требуемые аксессоры и разместите его на столе экземпляра требуемого контейнера верхнего уровня – MadProgrammer

ответ

1

Он отлично работает, чтобы отобразить его, но тогда мой JDialog не держит фокуса, который он должен (пользователь не должен быть в состоянии работать, используя основной интерфейс в то время как этот диалог открыт).

должны setModal(true) или setModalityTypes(various types) для родителей, или все окна из текущей виртуальной машины Java

Is it safe to get rid of the SwingUtilities.invokeLater() 

да точно, все Top-Level Container должны быть созданы на EDT, wrapped in invokeLater(), в том числе JOptionPane