2016-05-24 4 views
1

Hallo ich versuche, 2 Arrays zu verwenden, um eine JMenuBar mit JMenus und JMenuItems zu erstellen. Ich bin ziemlich neu in der Verwendung von GUI, ich habe eine Klasse, um dies zu erreichen, aber es funktioniert einfach nicht.JMenuBar Erstellung mit Schleife und String-Arrays Fehler

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]); 

     } 

    } 

} 

Der Code funktioniert bis zu dem Punkt, wo ich die JMenu ist erstellen, die einwandfrei funktioniert. Aber sobald ich ein JMenuItem in der zweiten Schleife erzeuge, bricht es, selbst wenn ich es nicht speichere oder anhefte, einfach ab und es zeigt nicht die Menüleiste im Rahmen an.

Es ist ziemlich seltsam, weil es tatsächlich funktioniert, sehr selten, was noch verwirrender ist.

das ist meine Hauptklasse:

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); 


    } 

} 

Antwort

1

GUI-bezogenen Code muss in dem GUI-Ereignis-Thread ausgeführt werden. Sie wollen wahrscheinlich, dies zu tun:

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); 
}); 

Es ist auch eine gute Idee setVisible zuletzt zu tun.

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); 
}); 
+0

Vielen Dank, das war es. Ich bin ziemlich neu in GUI, also war ich mir nicht bewusst. – user2620232

Verwandte Themen