1

我正在学习java,我正在尝试从另一个类向我的框架添加一个菜单栏(练习将代码分成多个类以更好地组织程序)。

这是我的代码示例:

public class MainApp {

public static void main(String[] args) {
    // Create window
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setSize(600, 400);

    // Create main panel
    JPanel content = new JPanel();
    content.setLayout(new BorderLayout());
    frame.add(content);

    //Create menu bar
    menubar menu = new menubar();
    content.add(menu.menuBar(), BorderLayout.NORTH);
            //Other stuff...

} // Ends main method
} // Ends MainApp class

和菜单栏类:

public class menubar {
public static void menuBar(){
    JMenuBar menu = new JMenuBar();
    JMenu file = new JMenu("File");
        JMenuItem clear = new JMenuItem("New");
        JMenuItem exit = new JMenuItem("Exit");
    JMenu help = new JMenu("Help");
        JMenuItem about = new JMenuItem("About");
        JMenuItem instructions = new JMenuItem("Instructions");
} // Ends method menuBar
} // Ends class menubar

我使用eclipse,并且在行中:

content.add(menu.menuBar(), BorderLayout.NORTH);

“添加”带有下划线,因此我无法编译代码。

我一直在寻找解决此问题的方法,据我所知,这应该可行。

任何帮助表示赞赏。

谢谢

乔什

4

4 回答 4

3

请注意,您的menuBar()方法是void类型,因此没有返回值,而您使用的内容 (JPanel) 的add()方法需要两个参数,它们是 (JComponent 类型[注意 JMenuBar 是 JComponent 的子类],int [用于布局目的]

content.add(menu.menuBar(), BorderLayout.NORTH);

下面是您的代码的快速修复:

public class menubar {
public static JMenuBar menuBar(){
    JMenuBar menu = new JMenuBar();
    JMenu file = new JMenu("File");
        JMenuItem clear = new JMenuItem("New");
        JMenuItem exit = new JMenuItem("Exit");
    JMenu help = new JMenu("Help");
        JMenuItem about = new JMenuItem("About");
        JMenuItem instructions = new JMenuItem("Instructions");
    return menu;
} // Ends method menuBar
} // Ends class menubar

我对您的建议是在 Java 中处理 GUI 时使用继承的概念(将菜单栏类扩展到 JMenuBar,以便您的类可以像 JMenuBar 一样工作)而不是依赖于组合的概念。您也可以按照上面的帖子来设置 JMenuBar:

frame.setJMenuBar(menu.menuBar());

如果您是 Java 编程新手,您需要开始练习 Java 编码标准,尤其是类和方法的正确命名。类名的第一个字母应该大写,而你的方法名应该至少有一个动词。:)

于 2013-09-21T16:35:25.267 回答
1

该方法menuBar具有void返回类型,因此不适用于该add方法。所以你需要

content.add(menubar.menuBar(), BorderLayout.NORTH);

menumenuBar方法返回时

Aside:setJMenuBar用于为a 设置JMenuBara JFrame

frame.setJMenuBar(menu.menuBar());
于 2013-09-21T16:16:43.673 回答
1

代替:

content.add(menu.menuBar(), BorderLayout.NORTH);

我想你的意思是:

content.add(menubar.menuBar(), BorderLayout.NORTH);

...但这仍然行不通,因为此方法的返回类型是void. 它需要是JMenuBar

于 2013-09-21T16:18:21.357 回答
1

我觉得你:

  • 不想创建new menubar()ifmenubar.menubar()是一个static函数
  • 想要public static JMenuBar menubar() { ... },而不是空虚
  • 否则menubar.menubar()return menu该方法只是昂贵的无操作

content.add(menu.menuBar(), ...)加下划线是因为您不能将一个void方法用作另一个方法的参数。

此外,您应该始终使用类而不是实例来引用静态字段或方法。并且类名应该以大写字母 ( Menu) 开头。

于 2013-09-21T16:20:09.543 回答