使用 MenuBar 创建框架 - pack() 无法识别大小,菜单栏正在被截断

Posted

技术标签:

【中文标题】使用 MenuBar 创建框架 - pack() 无法识别大小,菜单栏正在被截断【英文标题】:Creating a Frame with MenuBar - Size not recognized by pack(), menubar is being cutoff 【发布时间】:2015-05-24 14:06:46 【问题描述】:

对于一个练习,我需要一个由 2 个按钮组成的框架,如果单击一个按钮,则会显示一些文本。我还需要添加一个菜单栏。这很好用,它显示在框架中,但只显示第一个菜单。正如我已经发现的那样,问题在于使用pack() 方法,只考虑按钮大小,而不考虑菜单栏的大小。而且由于按钮比菜单栏小,它会被截断。

import java.awt.*;


public class Example extends Frame

    private MenuBar menuBar;
    private Menu program;
    private Menu messageSettings;
    private MenuItem itmClose;
    private MenuItem 

    public Example() 
        menuBar = new MenuBar();
        program = new Menu("Programm");
        messageSettings = new Menu("Nachrichtenverwaltung");

        itmClose = new MenuItem("Schließen");
        itmWelcome = new MenuItem("Willkommen");

        setLayout(new BorderLayout());

        menuBar.add(program);
        menuBar.add(messageSettings);
        program.add(itmClose);
        messageSettings.add(itmWelcome);

        setMenuBar(menuBar);
        pack(); //this one doesn't show a window
        //setSize(400,600); //this one shows a Window
        setVisible(true);
    

    public static void main(String args[]) 
        Example wnd = new Example();
    


对于这个最小的例子,我只显示了菜单栏,对我来说,这段代码现在打开了一个空窗口。如果我取消注释 setSize,我会看到整个菜单栏。

如果有人可以使用pack() 或其他不使用固定值的方法帮助我并使其正常工作,我将非常高兴。我还必须在本课程中使用 AWT。

【问题讨论】:

【参考方案1】:

如果没有具有preferred size 的Component,则窗口的content pane 为空。例如,我在下面添加了一个小的彩色Panel。作为练习,尝试删除任意大小并添加Component,例如LabelButton;在Panel 上尝试不同的layout managers。

import java.awt.*;

public class Example extends Frame 

    private MenuBar menuBar = new MenuBar();
    private Menu program = new Menu("Program");
    private Menu message = new Menu("Nachrichtenverwaltung");
    private MenuItem itmClose = new MenuItem("Schließen");
    private MenuItem itmWelcome = new MenuItem("Willkommen");

    public Example() 
        menuBar.add(program);
        menuBar.add(message);
        program.add(itmClose);
        message.add(itmWelcome);
        setMenuBar(menuBar);
        Panel panel = new Panel()

            @Override
            public Dimension getPreferredSize() 
                return new Dimension(320, 240);
            
        ;
        panel.setBackground(Color.cyan.darker());
        add(panel);
        pack(); 
        setVisible(true);
    

    public static void main(String args[]) 
        Example wnd = new Example();
    


请注意,上图中的平台会将MenuBar 移动到用户期望的位置。

【讨论】:

这两个答案都非常有帮助,但是,您的答案更灵活一些。谢谢!【参考方案2】:

我建议使用 Java Swing 库而不是使用旧的 Java AWT 库,除非你必须这样做。

编辑详情: Swing 库比 AWT 库更便于移植。这是因为它是一个纯粹的基于 Java 的 GUI,而不是使用大多数基于操作系统的 GUI 功能的 AWT。所以,就操作系统而言,swing 库只是在屏幕上放置一些像素。

我发现 swing 库比 AWT 更易于使用,尽管您仍然必须为 Listeners 使用 AWT。我觉得你最好看看 swing API,因为它应该让你更容易做你正在尝试的事情。

【讨论】:

如果您更详细地解释您的答案,这将对 OP 更有帮助 感谢您的回答,但我需要在本课程中使用 AWT。忘了提,但已经编辑了问题。 我想这可能是你的答案。我再看看能不能找到解决问题的办法。 我能想到的最佳解决方案是设置一个最小尺寸,以便宽度始终大于菜单的长度。这意味着您仍然可以调整窗口大小,只是不能使其小于菜单栏的大小。我认为主要问题与打包和使用菜单栏有关。但这应该是一个适当的解决方案。

以上是关于使用 MenuBar 创建框架 - pack() 无法识别大小,菜单栏正在被截断的主要内容,如果未能解决你的问题,请参考以下文章

在java中删除awt包中的MenuBar

Qt MainWindow 不显示 MenuBar [关闭]

Flex 4.5 MenuBar 垂直分隔符(使用 updateDisplayList)

使用tkinter.pack()始终使小部件居中

如何禁用 GWT MenuBar 中子菜单后面的阴影?

根据构建目标,在 fltk-rs 中使用 fltk::osxMenuBar 或 MenuBar