有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajmenubar可见性混乱

我正在学习Java中的GUI。 我有点困惑。当我像这样放置window.setVisible(true);时,我只会在调整JMenuBar的大小时看到它(如果没有某种交互,它不会显示)

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class Main {

    public static void main(String[] args) {

        JFrame window = new JFrame("My App");
        window.setSize(500, 500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        JMenuBar bar = new JMenuBar();
        window.setJMenuBar(bar);
        JMenu menu = new JMenu("File");
        bar.add(menu);

    }

}

但当我把它放在最底部时,它显示的和预期的一样。为什么会这样

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public class Main {

    public static void main(String[] args) {

        JFrame window = new JFrame("My App");
        window.setSize(500, 500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar bar = new JMenuBar();
        window.setJMenuBar(bar);
        JMenu menu = new JMenu("File");
        bar.add(menu);
        window.setVisible(true);

    }

}

这里解释说,它必须在最后调用,但这背后的原因是什么

java JMenuBar not visible?Why?


共 (1) 个答案

  1. # 1 楼答案

    添加组件后,必须重新绘制容器。 所以,若您在窗口可见后添加菜单栏,它将在下次重新绘制后弹出,在您的示例中,在调整大小后。若菜单栏是在设置窗口可见之前添加的,那个么它将在第一次绘制时绘制

    这是Swing组件的常见行为

    Component javadoc

    如果添加或删除组件:

    If the container has already been displayed, the hierarchy must be validated thereafter in order to display the added component.