Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 除非我将所有内容都放在一个类中,否则JMenuBar不会出现_Java_Swing_Jframe_Jmenubar - Fatal编程技术网

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

Java 除非我将所有内容都放在一个类中,否则JMenuBar不会出现,java,swing,jframe,jmenubar,Java,Swing,Jframe,Jmenubar,我想用菜单栏做一个框架,但我不能让它显示出来。我尝试使用pack(),因为在类似的问题中有人建议使用它,但这使我的框架不存在,最后我只使用了上面的窗口栏 如果我把所有的东西都放在一个类中,它就会起作用;所以我假设我的问题是关于Java结构的一些基本问题 这是我的JMenuBar课程: package jpaintnet; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.s

我想用菜单栏做一个框架,但我不能让它显示出来。我尝试使用
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.
    }
}
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.
  }
}
我的JFrame类:

package jpaintnet;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import java.awt.HeadlessException;
import javax.swing.JMenuBar;
import javax.swing.JPanel;

public class Frame extends JFrame
{

    public Frame(String title) throws HeadlessException {

        JMenuBar mb = new JMenuBar();
        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);

        this.setVisible(true);
    }
}
    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 );
  }
}
最后,我的主要观点是:

package jpaintnet;

public class Main {

    public static void main(String[] args) {

        Frame f = new Frame("JPaintNet");
        f.setVisible(true);
    }
}
我已经对其中一个
setVisible()
方法进行了注释,但为了以防万一,我最后再次将其放在这里


提前谢谢你。

你犯了几个错误

  • 框架中
    类删除以下导入

    import javax.swing.JMenuBar;
    
    因为一旦导入了
    swing.JMenuBar
    jvm就会忽略您创建的
    JMenuBar

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

    public class JMenuBar extends javax.swing.JMenuBar implements MenuListener, ActionListener
    
  • 去掉
    mb=newjmenubar()JMenuBar
    构造函数中的code>语句。因为当您创建一个
    新JMenuBar()
    时,jvm要做的第一件事就是调用它的构造函数。在构造函数中创建另一个
    new JMenuBar()
    意味着您不断创建大量
    JMenuBar
    s,这最终将导致
    StackOverFlow
    错误

  • 删除
    JMenuBar
    类中的变量
    mb
    ,并替换为
    this

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

  • 那你的窗户就可以开了


    更新:


    作为一个例子,请记住要使类名唯一,特别是在使用java开发的库时。这里还有一个附加提示,在创建数据库时避免使用java关键字作为表名或列名。如果将来要使用hibernate之类的框架,这将为您省去很多麻烦。

    @Andrew,已经更新了下面提供的代码,供您参考。参考内联注释:

    这是您的MyMenuBar即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.
        }
    }
    
    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,即Frame类:

    package jpaintnet;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.JFrame;
    import java.awt.HeadlessException;
    import javax.swing.JMenuBar;
    import javax.swing.JPanel;
    
    public class Frame extends JFrame
    {
    
        public Frame(String title) throws HeadlessException {
    
            JMenuBar mb = new JMenuBar();
            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);
    
            this.setVisible(true);
        }
    }
    
        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 );
      }
    }
    
    将创建如下窗口:


    我想这正是您想要的。

    您正在使用import javax.swing.JMenuBar并创建自己的类JMenuBar。永远不要使用重复的类名。如果您想要一个定制的JMenuBar,您应该扩展它并在那里添加额外的特性。此外,首先,JMenuBar不需要一个新类来添加项;所有这些都可以在框架类中的JMenuBar对象上调用。
    公共类JMenuBar扩展了JFrame
    @faris,非常感谢!我再也不会那样做了。你真的帮了我:)@ClaudiaProvoste请接受对你解决问题最有帮助的答案。它有助于未来的读者。如果答案没有帮助,请在下面留下评论。因此海报可以相应地更新它们。如果可能的话,不要重复使用现有的类名,这只是让人困惑(是的,我知道OP做了,所以让他们停止)