java - 如何创建出现在程序最顶部的 Swing 菜单栏?

标签 java swing user-interface kotlin menubar

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

我想在应用程序的最顶部的顶栏中为我的应用程序创建一个菜单栏。我对此进行了搜索,并找到了各种菜单栏教程,但每一个菜单栏教程都会产生一个带有应用程序图标和应用程序最小化、最大化和关闭按钮下方选项的栏。

连官方Java Documentation on the matter仅产生下图所示的结果。 An image of the menu bar below the top bar of the application

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

为了完美地展示我想要的样子,我提供了 Jetbrains 的 IntelliJ IDEA 的屏幕截图。据我所知,IntelliJ 是用 Swing 编写的,没有任何库,所以无论他们做什么,都只需使用 Swing 就可以实现。我希望在最顶部的栏上有一堆选项,就像下面的屏幕截图所示。 A screenshot of IntelliJ IDEA

以防万一我所说的内容有任何歧义,我希望我的顶部栏(带有关闭按钮、最大化和最小化按钮、图标和应用程序标题)也包含其他选项。在 IntelliJ 的例子中,包括文件、编辑、查看、导航等。根据我的应用程序的用途,我可能包括文件、保存、撤消、选项和帮助,所有这些都通过下拉列表来选择列表中的项目。 (例如,将鼠标悬停在文件上后,下拉菜单中可能会显示“打开”、“最近打开”、“新建”、“设置”等)

任何有关如何执行此操作的链接将不胜感激。同样,我正在使用 Kotlin 编写我的项目,但我也了解 Java,因此我将从两者中获取答案。

最佳答案

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

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

这是一个小型 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());
    }
}

关于java - 如何创建出现在程序最顶部的 Swing 菜单栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61715330/

相关文章:

java - 为什么 JFrame 不居中?

java - 如何使用 setLayout(null) 使 JPanel 保持在顶部(在 z 轴上)

java - 如何使JFrame成为模式化的?

javascript - 如何使用 PyQT 在 GUI 中播放 MP3

Java LinkedList 迭代器过早耗尽

java - AsyncTask 中的 NullPointerException

visual-studio - UI 和事件测试

java - RandomAccessFile 正确写入文件,但检索记录时失败

java - 仅使用 @Component 和 @Autowired 使用 SpringJUnit4ClassRunner 进行单元测试

java - 如何从字符串数组中获取流?