Вам нужен один поток для игрового цикла и один поток для обработки событий пользовательского интерфейса Swing, таких как щелчки мыши и нажатия клавиш.
Когда вы используете Swing API, вы автоматически получаете дополнительный поток для вашего пользовательского интерфейса, который называется потоком отправки событий. Ваши обратные вызовы выполняются в этом потоке, а не в главном.
Ваш основной поток подходит для игрового цикла, если вы хотите, чтобы игра запускалась автоматически при запуске программ. Если вы хотите запустить и остановить игру с графическим интерфейсом Swing, а затем запустить основной поток, тогда графический интерфейс может создать новый поток для игрового цикла, когда пользователь захочет запустить игру.
Нет, ваша строка меню не остановится, если вы поместите игровой цикл в основной поток. Строка меню остановится, если обратные вызовы Swing потребуют много времени.
Данные, которые разделяются между потоками, должны быть защищены с помощью блокировок.
Я предлагаю вам включить ваш Swing-код в отдельный класс и поместить только игровой цикл в основной класс. Если вы используете основной поток для своего игрового цикла, это приблизительное представление о том, как вы могли бы его спроектировать.
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
class GUI extends JFrame {
GameCanvas canvas = new GameCanvas();
final int FRAME_HEIGHT = 400;
final int FRAME_WIDTH = 400;
public GUI() {
// build and display your GUI
super("Game");
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem startMenuItem = new JMenuItem("Pause");
menuBar.add(fileMenu);
fileMenu.add(startMenuItem);
super.add(canvas);
super.setVisible(true);
super.setSize(FRAME_WIDTH, FRAME_WIDTH);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setJMenuBar(menuBar);
}
}
public class Main {
public static void main(String args[]) {
GUI ui = new GUI(); // create and display GUI
gameLoop(); // start the game loop
}
static void gameLoop() {
// game loop
}
}