Свой класс меню для приложения Java

348
08 августа 2021, 21:20

Я создал класс на основе класса JMenu, который принимает строковый ArrayList, хранящий названия подпунктов меню, и строку с названием пункта меню.

Например, пункт меню "файл" и его подпункты "новый", "сохранить", "сохранить как" и т.д.

Вот конструктор моего класса

package TextEditor;
import javax.swing.*;
import java.util.ArrayList;
public class TextEditorMenuItem extends JMenu {
 private ArrayList<JMenuItem> menu_items;
 private String menuName;
 private JMenu menuItem;
TextEditorMenuItem(String menu_name, ArrayList<String> menu_item_names) {
    menuName =menu_name;
    for (int i = 0; i < menu_item_names.size() - 1; i++) {
        JMenuItem menu = new JMenuItem(menu_item_names.get(i));
        menu_items.add(menu);
    }
}
public JMenu getItems (){
    for(int i = 0; i<menu_items.size()-1;i++) {
        menuItem = new JMenu(menuName);
        menuItem.add(menu_items.get(i));
     };
    return menuItem;
    };
}

Вот класс главного окна

package TextEditor;
import javax.swing.*;
import TextEditor.TextEditorMenu;
import java.awt.*;
import java.util.ArrayList;

 public class MainWindow extends JFrame {
 private ArrayList<String> menus;
 private ArrayList<String> menu_item;
 private TextEditorMenu menu_item_str;
 MainWindow(){
    setTitle("Текстовый редактор");
    menus = new ArrayList<String>();
    menus.add ("Файл");
    menus.add ("Правка");
    menus.add("Формат");
    menus.add("Справка");
    menu_item = new ArrayList<String>();
    menu_item.add("Новый");
    menu_item.add("Открыть");
    menu_item.add("Сохранить");
    menu_item.add("Сохранить как...");
    menu_item.add("Печать");
    menu_item.add("Выход");
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(new TextEditorMenuItem(menus.get(0), menu_item).getItems());
    setJMenuBar(menuBar);
}
public static void main(String[] args) {
    MainWindow mainWindow = new MainWindow();
    mainWindow.setSize(500,500);
    mainWindow.setDefaultCloseOperation(EXIT_ON_CLOSE);
    mainWindow.setVisible(true);
}
}

Ошибок синтаксиса нет, но при компиляции, возникают следующие исключения:

Exception in thread "main" java.lang.NullPointerException at TextEditor.TextEditorMenuItem.(TextEditorMenuItem.java:15) at TextEditor.MainWindow.(MainWindow.java:29) at TextEditor.MainWindow.main(MainWindow.java:35)

Где я ошибся? помогите исправить.

Answer 1
import javax.swing.JMenu;
public class TextEditorMenuItem extends JMenu {
    private static final long serialVersionUID = -3879042423861560439L;
    private final JMenu menuItem;
    public TextEditorMenuItem(String menuName, String ... menuItemNames) {
        this.menuItem = new JMenu(menuName);
        for (String mi : menuItemNames) menuItem.add(mi);
    }
    public JMenu getItems() {
        return menuItem;
    }
}
    import javax.swing.JFrame;
import javax.swing.JMenuBar;
public class MainWindow extends JFrame {
    private static final long serialVersionUID = 3927651758148511702L;    
    private final static String[] MENU = {"Файл", "Правка", "Формат", "Справка"};
    private final static String[] MENU_ITEM = {"Новый", "Открыть", "Сохранить",
        "Сохранить как...", "Печать", "Выход"};
    public MainWindow create(String [] menu, String [] menuItem) {
        setTitle("Текстовый редактор");
        JMenuBar menuBar = new JMenuBar();
        for (String m : menu) menuBar.add(new TextEditorMenuItem(m, menuItem).getItems());        
        setJMenuBar(menuBar);
        setSize(500, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        return this;
    }
    public static void main(String[] args) {
        MainWindow mainWindow = new MainWindow().create(MENU, MENU_ITEM);
    }
}

У меня не хватает для компиляции переменной - private TextEditorMenu menu_item_str, посему я ее убрал. Без нее все работает. Обратите внимание на правила именования переменных. Кроме того, цикл такого вида for(int i = 0; i<menu_items.size()-1;i++) работает некорректно. Он не читает последний элемент итерируемой коллекции (а если его читать не нужно, то зачем его создавать). А еще не ленитесь делать рефакторинг. Среда разработки сама подсказывает многие проблемные места кода. Не игнорируйте эти подсказки. Избыточность кода - это всегда плохо. Удачи)

READ ALSO
Чем отличается Latency и Response time?

Чем отличается Latency и Response time?

В небезывестной книге Фаулера написано:

225
Как зафиксировать размеры окна в Java

Как зафиксировать размеры окна в Java

При использовании менеджера компоновки FlowLayout можно удобно разместить элементы интерфейса в заданных размерах фреймаОднако, если в процессе...

388
Помогите понять работу return

Помогите понять работу return

Хотел бы понять как работает return, в принципе я понимаю как он работаетНо встал вопрос, в примере ниже я запускаю метод с пустым массивом, в методе...

104