Как вынести menuBar за static void main?

Как вынести menuBar за главный метод main?

import java.awt.EventQueue;
import java.util.Timer;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;



public class Snake extends JFrame{

    private static final long serialVersionUID = 1L;
    Timer timer;


    public Snake() {
    
    initUI();
    }

    public void initUI() {

        add(new Board());

        setResizable(false);
        pack();
    
        setTitle("Snake");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

 public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame startSnake = new Snake();
            JMenuBar menuBar = new JMenuBar();
            startSnake.add(menuBar);
            JMenu menu = new JMenu("О программе");
            JMenu menuSettings = new JMenu("Настройки");
            menuBar.add(menu);
            menuBar.add(menuSettings);
            
            JMenuItem menuBarColor = new JMenuItem("Цвет фона");
            JMenuItem menuBarLevel = new JMenuItem("Уровень");
            JMenuItem menuBarLen = new JMenuItem("Длина змейки");
            menuSettings.add(menuBarColor);
            menuSettings.add(menuBarLevel);
            menuSettings.add(menuBarLen);
            
            JMenuItem menuBarHelp = new JMenuItem("Справка");
            JMenuItem menuBarDev = new JMenuItem("О разработчике");
            JMenuItem menuBarSettings = new JMenuItem("Донат");
            menu.add(menuBarHelp);
            menu.add(menuBarDev);
            menu.add(menuBarSettings);

            
            startSnake.setJMenuBar(menuBar);
            startSnake.setVisible(true);
            

         }
     });
  }
}

Ответы (1 шт):

Автор решения: Nowhere Man

Весь код, ответственный за создание полосы меню, следует вынести в отдельный метод и вызвать его либо из метода initUI, либо из конструктора Snake после вызова этого метода.

При вызове invokeLater также лучше использовать более лаконичную лямбду.

import java.awt.EventQueue;

import javax.swing.*;

public class Snake extends JFrame{

    private static final long serialVersionUID = 1L;

    public static void main(String ... args) {
        EventQueue.invokeLater(() -> {
            JFrame startSnake = new Snake();
            startSnake.setVisible(true);
        });
    }


    public Snake() {
        initUI();
    }

    protected void initUI() {
        add(new Board(), BorderLayout.CENTER);
        setResizable(false);
        pack();

        setJMenuBar(createMenuBar());    
        setTitle("Snake");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("О программе");
        JMenu menuSettings = new JMenu("Настройки");
        menuBar.add(menu);
        menuBar.add(menuSettings);
            
        JMenuItem menuBarColor = new JMenuItem("Цвет фона");
        JMenuItem menuBarLevel = new JMenuItem("Уровень");
        JMenuItem menuBarLen = new JMenuItem("Длина змейки");
        menuSettings.add(menuBarColor);
        menuSettings.add(menuBarLevel);
        menuSettings.add(menuBarLen);
            
        JMenuItem menuBarHelp = new JMenuItem("Справка");
        JMenuItem menuBarDev = new JMenuItem("О разработчике");
        JMenuItem menuBarSettings = new JMenuItem("Донат");
        menu.add(menuBarHelp);
        menu.add(menuBarDev);
        menu.add(menuBarSettings);

        return menuBar;
    }
}
→ Ссылка