为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2021-09-12 10:42:41
我正在尝试使用 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.    }}
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

你犯了几个错误。

  1. 在您的Frame课程中删除以下导入

    import javax.swing.JMenuBar;

    因为一旦你导入了swing.JMenuBarjvm 就会忽略JMenuBar你创建的。

  2. 您的JMenuBar类应该从 扩展javax.swing.JMenuBar,而不是从JFrame.

    public class JMenuBar extends javax.swing.JMenuBar implements MenuListener, ActionListener
  3. 去掉构造函数中的mb = new JMenuBar();语句JMenuBar。因为当你创建一个new JMenuBar()jvm 的第一件事就是调用它的构造函数。new JMenuBar()在构造函数中创建另一个意味着您不断创建如此多的JMenuBars,这最终会导致StackOverFlow错误。

  4. 删除变量mb在你的JMenuBar类并将其替换this

    this.add(addObject);
    this.add(addImage);
    this.add(save);

那么你的窗口应该工作得很好。

//img1.sycdn.imooc.com//613d6a2c00011ff406380086.jpg

查看完整回答
反对 回复 2021-09-12
?
皈依舞

TA贡献1851条经验 获得超3个赞

已更新您的代码,如下所示供您参考。参考内联评论:


这是您的 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 );

  }

}

将创建窗口,如:

//img1.sycdn.imooc.com//613d6a3d000133ec03520093.jpg

查看完整回答
反对 回复 2021-09-12
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信