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做了,所以让他们停止)