Я узнал о том, что 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 не делает это автоматически?