带有循环和字符串数组错误的 JMenuBar 创建

JMenuBar creation with loop and string arrays error

您好,我正在尝试使用 2 个数组来创建带有 JMenus 和 JMenuItems 的 JMenuBar。我对使用 GUI 还很陌生,我做了一个 class 来实现这个,但它就是行不通。

import java.util.*;
import javax.swing.*;

public class MenuBar {

    String[] titulos = {"Raices","Sistemas","Interpolacion","Dif. e Int.","Ecuaciones"};
    String[][] subTitulos = {{"Biseccion","Falsa Posicion","Secante","Newton-Rhapson","Aprox. Sucesivas","Newton 2ndo. Orden"},
            {"Gauss","Gauss-Jordan","Montante","Cramer","Jacobi","Gauss-Seidel"},
            {"Diferencias Finitas","Newton","LaGrange","Min. Cuadrados"},
            {"Por Limites","Diferencias Finitas","Trapecio","Trapecio","Simpson","Simpson"},
            {"Euler","Euler-Gauss"}};

    public JMenuBar menuBar = new JMenuBar();
    public JMenu[] menus;
    public List<List<JMenuItem>> menuItems;

    public MenuBar(){
        menus = new JMenu[titulos.length];
        menuItems = new ArrayList<List<JMenuItem>>();

        for (int i=0;i<titulos.length;i++){ 
            menus[i]= new JMenu(titulos[i]);
            menuItems.add(new ArrayList<JMenuItem>());


            for(int j=0;j<subTitulos[i].length;j++){
                menuItems.get(i).add(new JMenuItem(subTitulos[i][j]));
                menus[i].add(menuItems.get(i).get(j));
            }

            menuBar.add(menus[i]);

        }

    }

}

代码一直到我创建 JMenu 的时候都能正常工作,它完美无缺。但是一旦我在第二个循环中创建一个 JMenuItem,即使我不存储或附加它,它也会中断,并且不会在框架中显示 menuBar。

这很奇怪,因为它确实有效,但很少见,这更令人困惑。

这是我的主class:

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Menu");
        frame.setVisible(true);
        frame.setSize(900, 800);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MenuBar menuBar = new MenuBar();

        frame.setJMenuBar(menuBar.menuBar);


    }

}

GUI 相关代码必须 运行 在 GUI 事件线程中。你可能想这样做:

SwingUtilities.invokeLater(() -> {
   JFrame frame = new JFrame("Menu");
   frame.setVisible(true);
   frame.setSize(900, 800);
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   MenuBar menuBar = new MenuBar();
   frame.setJMenuBar(menuBar.menuBar);
});

最后做 setVisible 也是个好主意。

 SwingUtilities.invokeLater(() -> {
   MenuBar menuBar = new MenuBar();

   JFrame frame = new JFrame("Menu");       
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   frame.setJMenuBar(menuBar.menuBar);
   frame.setSize(900, 800);
   frame.setVisible(true);
});