猿问

除非我将所有内容都放在一个类中,否则 JMenuBar 不会出现

我正在尝试使用 MenuBar 制作框架,但无法显示。我尝试使用pack()它,因为它在类似问题中被建议,但这使我的框架不存在,我最终只有上部窗口栏。


如果我把所有东西都放在一个类中,它就可以工作;所以我认为我的问题是关于 Java 结构的一些基本问题。


这是我的 JMenuBar 类:


package jpaintnet;


import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuItem;

import javax.swing.event.MenuEvent;

import javax.swing.event.MenuListener;


public class JMenuBar extends JFrame implements MenuListener, ActionListener {


    JMenuBar mb;

    JMenu addImage, addObject, save;

    JMenuItem circle, rectangle, triangle, line;


    public JMenuBar() {


        mb = new JMenuBar();


        addObject = new JMenu("Add Object");

        mb.add(addObject);


        addImage = new JMenu("Add a new image");

        mb.add(addImage);


        save = new JMenu("save");

        mb.add(save);



        circle = new JMenuItem("Create a circle");

        circle.addActionListener(this);

        addObject.add(circle);


        rectangle = new JMenuItem("Create a rectangle");

        rectangle.addActionListener(this);

        addObject.add(rectangle);


        triangle = new JMenuItem("Create a triangle");

        triangle.addActionListener(this);

        addObject.add(triangle);


        line = new JMenuItem("Create a line");

        line.addActionListener(this);

        addObject.add(line);

    }




    @Override

    public void actionPerformed(ActionEvent e) {

       //here goes everything!

    }


    @Override

    public void menuSelected(MenuEvent e) {

    }


    @Override

    public void menuDeselected(MenuEvent e) {

        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    }


    @Override

    public void menuCanceled(MenuEvent e) {

        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    }

}


qq_花开花谢_0
浏览 125回答 2
2回答

慕运维8079593

你犯了几个错误。在您的Frame课程中删除以下导入import javax.swing.JMenuBar;因为一旦你导入了swing.JMenuBarjvm 就会忽略JMenuBar你创建的。您的JMenuBar类应该从 扩展javax.swing.JMenuBar,而不是从JFrame.public class JMenuBar extends javax.swing.JMenuBar implements MenuListener, ActionListener去掉构造函数中的mb = new JMenuBar();语句JMenuBar。因为当你创建一个new JMenuBar()jvm 的第一件事就是调用它的构造函数。new JMenuBar()在构造函数中创建另一个意味着您不断创建如此多的JMenuBars,这最终会导致StackOverFlow错误。删除变量mb在你的JMenuBar类并将其替换this。this.add(addObject); this.add(addImage); this.add(save);那么你的窗口应该工作得很好。

皈依舞

已更新您的代码,如下所示供您参考。参考内联评论:这是您的 MyMenuBar 即 JMenuBar 类:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.event.MenuEvent;import javax.swing.event.MenuListener;/* * 1. Renamed your class "JMenuBar" to "MyMenuBar" - do not use Java class names. Its bad practice * 2. Extend from JMenuBar class to create Menu Bar. Whereas JFrame requires to create a frame */public class MyMenuBar extends JMenuBar implements MenuListener, ActionListener {   JMenu addImage, addObject, save;  JMenuItem circle, rectangle, triangle, line;  public MyMenuBar() {      addObject = new JMenu("Add Object");      add(addObject);      addImage = new JMenu("Add a new image");      add(addImage);      save = new JMenu("save");      add(save);      circle = new JMenuItem("Create a circle");      circle.addActionListener(this);      addObject.add(circle);      rectangle = new JMenuItem("Create a rectangle");      rectangle.addActionListener(this);      addObject.add(rectangle);      triangle = new JMenuItem("Create a triangle");      triangle.addActionListener(this);      addObject.add(triangle);      line = new JMenuItem("Create a line");      line.addActionListener(this);      addObject.add(line);  }  @Override  public void actionPerformed(ActionEvent e) {     //here goes everything!  }  @Override  public void menuSelected(MenuEvent e) {  }  @Override  public void menuDeselected(MenuEvent e) {      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.  }  @Override  public void menuCanceled(MenuEvent e) {      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.  }}这是您的 MyFrame 即框架类:    import java.awt.BorderLayout;import java.awt.Color;import javax.swing.JFrame;import javax.swing.JPanel;public class MyFrame  extends  JFrame {  public MyFrame( String title ) {    MyMenuBar mb = new MyMenuBar();    JPanel panel = new JPanel();    this.setBounds( 100, 100, 640, 480 );    this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );    this.setBackground( Color.white );    this.getContentPane().add( BorderLayout.SOUTH, panel );    // this.getContentPane().add( BorderLayout.NORTH, mb ); //Do not use this    // method to set menu bar    this.setJMenuBar( mb ); // this is ideal method to set menu bar    this.setTitle( title ); // Missing as you have supplied title but missed to set it to frame    this.setVisible( true );  }  // added main method here from your Main class  public static void main( String[] args ) {    MyFrame f = new MyFrame( "JPaintNet" );    f.setVisible( true );  }}将创建窗口,如:
随时随地看视频慕课网APP

相关分类

Java
我要回答