使用 MenuBar 创建框架 - pack() 无法识别尺寸,菜单栏被截断
Creating a Frame with MenuBar - Size not recognized by pack(), menubar is being cutoff
作为练习,我需要一个由 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();
}
}
对于这个最小的例子,我只显示了菜单栏,对我来说,这段代码现在打开一个空的 window。如果我取消注释 setSize
,我会看到整个菜单栏。
如果有人可以使用 pack()
或其他不使用固定值的方法帮助我并使它正常工作,我将非常高兴。我还必须在本课程中使用 AWT。
我建议使用 Java Swing 库而不是使用旧的 Java AWT 库,除非你必须这样做。
编辑详情:
Swing 库比 AWT 库可移植性强得多。这是因为它是一个纯粹基于 Java 的 GUI,而不是使用大多数基于 OS 的 GUI 功能的 AWT。因此,就 OS 而言,swing 库只是在屏幕上放置一些像素。
我发现 swing 库比 AWT 更容易使用,尽管您仍然需要为 Listeners 使用 AWT。我觉得你最好看看秋千 API,因为它会让你更容易做你正在尝试的事情。
没有 Component
Panel
。
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 个按钮组成的框架,如果单击其中一个按钮,则会显示一些文本。我还需要添加一个菜单栏。这工作正常,它显示在框架中,但只显示第一个菜单。正如我已经发现的那样,问题是使用 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();
}
}
对于这个最小的例子,我只显示了菜单栏,对我来说,这段代码现在打开一个空的 window。如果我取消注释 setSize
,我会看到整个菜单栏。
如果有人可以使用 pack()
或其他不使用固定值的方法帮助我并使它正常工作,我将非常高兴。我还必须在本课程中使用 AWT。
我建议使用 Java Swing 库而不是使用旧的 Java AWT 库,除非你必须这样做。
编辑详情: Swing 库比 AWT 库可移植性强得多。这是因为它是一个纯粹基于 Java 的 GUI,而不是使用大多数基于 OS 的 GUI 功能的 AWT。因此,就 OS 而言,swing 库只是在屏幕上放置一些像素。
我发现 swing 库比 AWT 更容易使用,尽管您仍然需要为 Listeners 使用 AWT。我觉得你最好看看秋千 API,因为它会让你更容易做你正在尝试的事情。
没有 Component
Panel
。
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
移动到用户期望的位置。