2 回答
TA贡献1876条经验 获得超5个赞
你犯了几个错误。
在您的
Frame
课程中删除以下导入import javax.swing.JMenuBar;
因为一旦你导入了
swing.JMenuBar
jvm 就会忽略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()
在构造函数中创建另一个意味着您不断创建如此多的JMenuBar
s,这最终会导致StackOverFlow
错误。删除变量
mb
在你的JMenuBar
类并将其替换this
。this.add(addObject); this.add(addImage); this.add(save);
那么你的窗口应该工作得很好。
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 );
}
}
将创建窗口,如:
添加回答
举报