Java 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 ответа

Вы не должны расширять JMenuBar в первую очередь. Просто создайте и используйте JMenuBar вместо того, чтобы расширять его. Кстати, проблема в том, что ваш подкласс JMenuBar не добавляет меню к себе, а к другому JMenuBar, который он создает:

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

должно быть

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

Зачем вам создавать 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);
}

}

Другие вопросы по тегам