Я создал класс на основе класса 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)
Где я ошибся? помогите исправить.
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++)
работает некорректно. Он не читает последний элемент итерируемой коллекции (а если его читать не нужно, то зачем его создавать). А еще не ленитесь делать рефакторинг. Среда разработки сама подсказывает многие проблемные места кода. Не игнорируйте эти подсказки. Избыточность кода - это всегда плохо. Удачи)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При использовании менеджера компоновки FlowLayout можно удобно разместить элементы интерфейса в заданных размерах фреймаОднако, если в процессе...
Хотел бы понять как работает return, в принципе я понимаю как он работаетНо встал вопрос, в примере ниже я запускаю метод с пустым массивом, в методе...