Как использовать диспетчерский поток событий?

Я узнал о том, что swing не является потокобезопасным. Углубившись, я обнаружил, что каждое изменение компонента swing должно выполняться в потоке диспетчера событий, чтобы предотвратить различные проблемы, связанные с многопоточностью. Однако на этом информация, похоже, полностью исчерпывается. Похоже, что в Интернете нет ни одного хорошего учебника, который бы объяснял, как это сделать.

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

try {
        SwingUtilities.invokeAndWait(new Runnable() {

            public void run() {
                setTitle("Frame title");
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible(true);

                setSize(800, 480);
                setLocationRelativeTo(null);
                setIconImage(Toolkit.getDefaultToolkit().createImage(ClassLoader.getSystemResource("Frame icon.png")));
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }

В принципе, правильно ли это? Должен ли я помещать этот код (или эквивалент с invokeLater) вокруг каждой модификации компонента Swing в моем коде?

Также, почему Swing не делает это автоматически?

8
задан yizzlez 21 May 2014 в 21:17
поделиться