Я не делаю все эти звонки Swing из init.Init должен установить все необходимые графические настройки для текущего объекта JFrame и связать слушателя ключа с ним.
ОК, я вижу, вы немного изменили свой код:
private void init()
{
...
try
{
disp = gdev.getFullScreenWindow();
if(disp != null)
{
gdev.setDisplayMode(use_dm);
disp.createBufferStrategy(2);
disp.setFocusTraversalKeysEnabled(false);
disp.addKeyListener((KeyListener)screen_list);
}
}
catch(IllegalArgumentException ex)
{
}
...
}
но выВы по-прежнему делаете вызовы Swing в init, когда вы получаете JFrame, устанавливаете его режим отображения и стратегию буфера, это бизнес для обхода фокуса и добавляете ключевого слушателя.Почему эти вызовы выполняются в фоновом потоке, так как они не должны мешать обработке Swing (поэтому не нужно делать это в фоновом режиме) и на самом деле являются "вызовами Swing", так как вы меняете состояние Swingобъекты с ними.doInBackground предназначен для запуска длительных или ресурсоемких процессов, которые при запуске на EDT приведут к зависанию GUI и отключению его.Код, который вы показали, не делает этого.Опасность выполнения вызовов Swing в фоновом потоке заключается в том, что, хотя он будет работать в 95% случаев, он неожиданно завершится сбоем, что приведет к сбою и сбою приложения, обычно в самый неподходящий момент.
Кроме того, почему пустой блок catch?Я бы, по крайней мере, вставил туда ex.printStackTrace (), чтобы не ослепнуть.
2), затем я создаю свой экранный слистер, который реализует ActionListener и Key Listener, он связанс disp в качестве KeyListener в методе init ():
Так правильно ли я заявляю, что вы добавляете KeyListener в JFrame?Я сомневаюсь, что это сработает, так как KeyListeners отвечают, только если связанный компонент имеет фокус, что JFrame редко делает или хочет делать.Возможно, вы захотите использовать более универсальные привязки клавиш, поскольку это даст большую гибкость в отношении фокусировки и отзывчивости.
3) затем я создаю и инициализирую свой Swing Timer и запускаю его;
OK
4) И, наконец, я вызываю метод execute.-
public void run(int pause, int delay)
{
...
try
{
screen_list = new ScreenListener();
tm = new Timer(delay, screen_list);
tm.setInitialDelay(pause);
tm.setRepeats(true);
tm.start();
worker.execute();
}
catch(Exception e)
{}
...
}
Опять у вас есть пустой блок catch.
И вы можете рассказать нам больше о ваших конкретных проблемах?Мы видим кусочки несвязанного кода с расплывчатым описанием того, что он делает, но на самом деле пока не имеем полного представления о чем-либо.Можете ли вы дать нам более подробное описание вашей программы и ее проблем?Вы пытаетесь создать SSCCE в соответствии с рекомендациями Эндрю?Если бы вы могли создать и опубликовать это, мы были бы намного лучше протестировать и изменить вашу программу и помочь вам найти решение.Желаем удачи