Java JMenuBar未正确添加或显示

时间:2012-11-28 22:15:52

标签: java swing subclass jmenubar

我正在尝试将JMenuBar的子类添加到用户界面,但由于某种原因它永远不会出现。我已经尝试过使用JFrame.setJMenubar()和JFrame.add(),我尝试在SwingUtilities.invokeLater()调用等中添加它...当它在使用JMenuBar本身而不是子类时它仍然有效,所以我怀疑它与此有关。

这是初始化应用程序窗口的代码:

public DramaSimWindow() {
    initializeSelf();
    initializeContainers();
    this.setVisible(true);
}

private void initializeSelf() {
    initializeContentPane();
    this.setBounds(100, 100, 800, 500);
    this.setJMenuBar(new DramaSimMenuBar());
    this.setResizable(false);
}

这是JMenuBar的子类,它作为私有类位于主窗口类中:

private class DramaSimMenuBar extends JMenuBar {

    private static final long serialVersionUID = 1L;

    public DramaSimMenuBar() {
        initializeSelf();
    }

    private void initializeSelf() {
        menuBar = new JMenuBar();
        initializeFileMenu();
        initializeEditMenu();
    }

    private void initializeFileMenu() {
        JMenu fileMenu = new JMenu("File");
        fileMenu.add(new JMenuItem("New"));
        fileMenu.add(new JMenuItem("Open"));
        fileMenu.add(new JMenuItem("Save"));
        fileMenu.add(new JMenuItem("Save as"));
        fileMenu.add(new JMenuItem("Exit"));
        menuBar.add(fileMenu);
    }

    private void initializeEditMenu() {
        JMenu editMenu = new JMenu("Edit");
        editMenu.add(new JMenuItem("Copy"));
        editMenu.add(new JMenuItem("Cut"));
        editMenu.add(new JMenuItem("Paste"));
        menuBar.add(editMenu);
    }
}

2 个答案:

答案 0 :(得分:6)

您不应该首先扩展JMenuBar。只需创建使用 JMenuBar而不是扩展它。顺便说一句,问题是你的JMenuBar子类不会向自己添加菜单,而是向它创建的另一个JMenuBar:

private void initializeSelf() {
    menuBar = new JMenuBar();
    ...
    menuBar.add(fileMenu);

应该是

private void initializeSelf() {
    ...
    this.add(fileMenu);

答案 1 :(得分:2)

如果你的基类是从JMenuBar扩展的,为什么要创建一个JMenuBar,所以正确的代码如下: private class DramaSimMenuBar extends JMenuBar {

private static final long serialVersionUID = 1L;

public DramaSimMenuBar() {
    initializeSelf();
}

private void initializeSelf() {
    initializeFileMenu();
    initializeEditMenu();
}

private void initializeFileMenu() {
    JMenu fileMenu = new JMenu("File");
    fileMenu.add(new JMenuItem("New"));
    fileMenu.add(new JMenuItem("Open"));
    fileMenu.add(new JMenuItem("Save"));
    fileMenu.add(new JMenuItem("Save as"));
    fileMenu.add(new JMenuItem("Exit"));
    add(fileMenu);
}

private void initializeEditMenu() {
    JMenu editMenu = new JMenu("Edit");
    editMenu.add(new JMenuItem("Copy"));
    editMenu.add(new JMenuItem("Cut"));
    editMenu.add(new JMenuItem("Paste"));
    add(editMenu);
}

private static final long serialVersionUID = 1L; public DramaSimMenuBar() { initializeSelf(); } private void initializeSelf() { initializeFileMenu(); initializeEditMenu(); } private void initializeFileMenu() { JMenu fileMenu = new JMenu("File"); fileMenu.add(new JMenuItem("New")); fileMenu.add(new JMenuItem("Open")); fileMenu.add(new JMenuItem("Save")); fileMenu.add(new JMenuItem("Save as")); fileMenu.add(new JMenuItem("Exit")); add(fileMenu); } private void initializeEditMenu() { JMenu editMenu = new JMenu("Edit"); editMenu.add(new JMenuItem("Copy")); editMenu.add(new JMenuItem("Cut")); editMenu.add(new JMenuItem("Paste")); add(editMenu); }