首页 > 解决方案 > 如何创建一个出现在程序最顶部的 Swing 菜单栏?

问题描述

编码语言:我在 Kotlin 中使用 Swing 进行编码,但如果您提供任何 Java 代码,我可以将其转码为 Kotlin。我知道 Kotlin 和 Java,所以我也能理解。此外,在这个阶段,我正在使用 Swing 编写我的应用程序,没有库。

我想在应用程序的最顶部,在顶部栏中为我的应用程序创建一个菜单栏。我已经搜索过这个并找到了各种菜单栏教程,但其中每一个都会导致一个栏,在应用程序图标和应用程序最小化、最大化和关闭按钮下方都有选项。

即使是关于此事的官方Java 文档也只会产生下图。 应用程序顶部栏下方的菜单栏图像

还有许多其他教程,但它们都只展示了如何在应用程序的实际顶部下方创建一个菜单栏。我以为这只是因为应用程序无法更改顶部栏上的内容,但后来我意识到 Chrome,我现在正在使用的应用程序,不只是显示标题、图标和三个按钮。它有一个完整的标签系统。所有 Microsoft Office 应用程序的顶部栏都有额外的按钮,尽管它们有一个额外的菜单项栏。提供了一个屏幕截图,显示了一个自动保存按钮和一些附加功能。(我删除了我的详细信息) Microsoft Word 的屏幕截图

对于我希望自己的外观的完美示例,我提供了 Jetbrains 的 IntelliJ IDEA 的屏幕截图。据我所知,IntelliJ 是用 Swing 编写的,没有任何库,所以无论他们做什么,只要 Swing 就可以实现。我希望在最上面的栏上有一堆选项,就像下面的屏幕截图一样。 IntelliJ IDEA 截图

以防万一我在说什么有任何歧义,我希望我的顶部栏,即带有关闭按钮、最大化和最小化按钮、图标和应用程序标题的顶部栏也包含其他选项。在 IntelliJ 的情况下,包括 File、Edit、View、Navigate 等。根据我的应用程序的用途,我可能包括 File、Save、Undo、Options 和 Help 所有的下拉菜单来选择列表中的项目。(例如,将鼠标悬停在文件上后,下拉菜单中可能有打开、打开最近、新建、设置等)

任何有关如何执行此操作的链接将不胜感激。同样,我正在用 Kotlin 编写我的项目,但我也知道 Java,所以我将从两者中得到答案。

标签: javaswinguser-interfacekotlinmenubar

解决方案


Swing中的顶部栏称为标题JFrame。它是所谓的装饰的一部分。边框也是装饰品的一部分。JFrameJFrame

你能做的就是去掉装饰物。然后菜单栏将出现,就好像它是顶部栏一样。删除装饰是通过调用方法来实现的setUndecorated(true)。移除装饰也意味着JFrame不能移动或调整大小,因为它没有边框或标题栏。而且因为没有标题栏,所以也没有 X 按钮,您可以单击该按钮来关闭JFrame. 您可以添加允许您移动和调整大小的代码,JFrame但我认为这不在您的问题范围内。无论如何,如果这与您相关,您将在 Internet 上找到如何执行此操作的示例。尽管如此,您仍然可以JFrame通过按 Alt+F4 键关闭键盘。

这是一个小型Swing应用程序,它显示一个空的、未装饰JFrame的、有一个菜单的。

import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

public class MenuTest implements Runnable {
    private JFrame frame;

    public void run() {
        createAndShowGui();
    }

    private void createAndShowGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setJMenuBar(createMenuBar());
        frame.setSize(400, 350);
        frame.setUndecorated(true);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JMenu createEditMenu() {
        JMenu editMenu = new JMenu("Edit");
        JMenuItem cutItem = new JMenuItem("Cut");
        editMenu.add(cutItem);
        JMenuItem copyItem = new JMenuItem("Copy");
        editMenu.add(copyItem);
        JMenuItem pasteItem = new JMenuItem("Paste");
        editMenu.add(pasteItem);
        return editMenu;
    }

    private JMenu createFileMenu() {
        JMenu fileMenu = new JMenu("File");
        JMenuItem newItem = new JMenuItem("New");
        fileMenu.add(newItem);
        JMenuItem openItem = new JMenuItem("Open");
        fileMenu.add(openItem);
        JMenuItem saveItem = new JMenuItem("Save");
        fileMenu.add(saveItem);
        return fileMenu;
    }

    private JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createFileMenu());
        menuBar.add(createEditMenu());
        return menuBar;
    }

    public static void main(String[] args) {
        UIManager.put("MenuBar.background", Color.LIGHT_GRAY);
        EventQueue.invokeLater(new MenuTest());
    }
}

推荐阅读