使用MenuBar创建框架 - pack()无法识别尺寸,菜单栏正在被切断

时间:2015-05-24 14:06:46

标签: java awt menubar

对于练习我需要有一个由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。

2 个答案:

答案 0 :(得分:1)

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

image

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移动到用户期望的位置。

答案 1 :(得分:0)

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

编辑细节: Swing库比AWT库更便携。这是因为它是纯粹的基于Java的GUI,而AWT则使用大多数基于操作系统的GUI功能。因此,就操作系统而言,swing库只是在屏幕上放置一些像素。

我发现swing文件库比AWT更容易使用,尽管你仍然需要使用AWT作为监听器。我觉得你最好看看swing API,因为它应该让你更容易做你正在尝试的事情。