Java setJMenuBar不工作

Java setJMenuBar不工作,java,swing,Java,Swing,经过大量的谷歌搜索,我发现这个问题通常是针对具体情况的。我已经尝试了很多找到的解决方案,但没有一个对我有效,所以我觉得在上面写一篇帖子是合适的 我正在使用setJMenuBar,但该条从未出现,以下是我的代码: 注意:我相信原因是我更新了框架,但是解决方案仍然未知 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.a

经过大量的谷歌搜索,我发现这个问题通常是针对具体情况的。我已经尝试了很多找到的解决方案,但没有一个对我有效,所以我觉得在上面写一篇帖子是合适的

我正在使用setJMenuBar,但该条从未出现,以下是我的代码:

注意:我相信原因是我更新了框架,但是解决方案仍然未知

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.image.BufferStrategy;

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

@SuppressWarnings("serial")
public class testclass extends JFrame { 


    public int updateRate = 60;

    public int screenWidth;
    public int screenHeight;

    public boolean finishedInitialPaint;

    private Graphics bufferGraphics;
    private BufferStrategy bufferStrategy;

    public int gridSize = 10;

    JMenuBar engineBar;
    JMenu fileMenu, editMenu, createMenu, toolsMenu, panelsMenu;
    JMenuItem fileNewScene, fileOpenScene, fileSaveScene, fileExit;
    JMenuItem editPreferences, editEngine;
    JMenuItem createEmpty, createStandard;
    JMenuItem toolsDebug;
    JMenuItem panelView2D, panelEditor2D, panelHierarchy, panelInspector, panelExplorer;

    public static void main(String[] args) {
        testclass testClassv = new testclass ();
    }

    public testclass () {
        Start ();

        while(true) {
            Update ();
            ClearBackBuffer ();
            try {
                Thread.sleep(1000 / updateRate);
            } catch (InterruptedException e) {

            }
        }

    }

    private void Start () {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        screenWidth = screenSize.width;
        screenHeight = screenSize.height;

        CreateDefaultEngineMenu ();

        setTitle("Test Window");
        setSize(Math.round(screenWidth * 0.99f), Math.round(screenHeight * 0.9f));
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void CreateDefaultEngineMenu () {
        engineBar = new JMenuBar ();

        /*
         * Building initial menus
         */

    // Build the file menu
        fileMenu = new JMenu("File");
        engineBar.add(fileMenu);

    // Build the edit menu
        editMenu = new JMenu("Edit");
        engineBar.add(editMenu);

    // Build the create menu
        createMenu = new JMenu("Create");
        engineBar.add(createMenu);

    // Build the tools menu
        toolsMenu = new JMenu("Tools");
        engineBar.add(toolsMenu);

    // Build the panels menu
        panelsMenu = new JMenu("Panels");
        engineBar.add(panelsMenu);

        /*
         *  Building menu options
         */

    // File menu options
        fileNewScene = new JMenuItem("New Scene");
        fileMenu.add(fileNewScene);
        fileOpenScene = new JMenuItem("Open Scene");
        fileMenu.add(fileOpenScene);
        fileSaveScene = new JMenuItem("Save Scene");
        fileMenu.add(fileSaveScene);
        fileExit = new JMenuItem("Exit");
        fileMenu.add(fileExit);

    // Edit menu options
        editPreferences = new JMenuItem ("Preferences");
        editMenu.add(editPreferences);
        editEngine = new JMenuItem ("Engine Settings");
        editMenu.add(editEngine);

    // Create menu options
        createEmpty = new JMenuItem("New Empty GameObject");
        createMenu.add(createEmpty);
        createStandard = new JMenuItem("Standard GameObjects");
        createMenu.add(createStandard);

    // Tools menu options
        toolsDebug = new JMenuItem ("Debug");
        toolsMenu.add(toolsDebug);

    // Panels menu options
        panelView2D = new JMenuItem("View 2D");
        panelsMenu.add(panelView2D);
        panelEditor2D = new JMenuItem("Editor 2D");
        panelsMenu.add(panelEditor2D);
        panelHierarchy = new JMenuItem("Hierarchy");
        panelsMenu.add(panelHierarchy);
        panelInspector = new JMenuItem("Inspector");
        panelsMenu.add(panelInspector);
        panelExplorer = new JMenuItem("Explorer");
        panelsMenu.add(panelExplorer);


        // Set the frame to use the bar
        setJMenuBar(engineBar);
    }

    private void Update () {
        //sceneObjects.activeObjects.get(0).transform.position.x += 0.1f;
        initialize ();
        ClearBackBuffer ();
        repaint ();
        DrawBackBufferToScreen ();
    }

    private void initialize () {
        if(bufferStrategy == null) {
            this.createBufferStrategy(2);
            bufferStrategy = this.getBufferStrategy();
            bufferGraphics = bufferStrategy.getDrawGraphics();
        }
    }

    public void paint(Graphics g) {
        // Something to go here
    }

    private void ClearBackBuffer () {
        bufferGraphics = bufferStrategy.getDrawGraphics();
        try {
            bufferGraphics.clearRect(0, 0, this.getSize().width, this.getSize().height);
            Graphics2D g2d = (Graphics2D)bufferGraphics;
            paint2D(g2d);
        } catch (Exception e) {
            //Debug.EngineLogError("Engine", "Failed to clear rect for frame buffer (Failed to draw frame) - Exception");
        } finally {
            bufferGraphics.dispose();
        }
    }

    private void DrawBackBufferToScreen () {
        bufferStrategy.show();
        Toolkit.getDefaultToolkit().sync();
    }

    private void paint2D (Graphics2D g2d) {
        // Multi-Used Variables
        int canvasWidth = Math.round(screenWidth / 2);
        int canvasHeight = Math.round(screenHeight / 2);

        // Draw panel borders
        // View2D
        g2d.setColor(Color.black);
        g2d.drawRect((canvasWidth) - (canvasWidth / 2) - 1, canvasHeight - (Math.round(canvasHeight / 1.35f)) - 1, canvasWidth + 1, canvasHeight + 1);
    }

}
非常感谢所有相关的回答


编辑:修复了可以原始测试的代码

您的代码中有很多错误,但最大的问题是:

public void paint(Graphics g) {
    // Something to go here
}
通过覆盖绘制,您将阻止JFrame对其自身、其边界以及与您的问题相关的子组件进行必要的绘制。所以你的菜单从来没有画过

您永远不应该直接在JFrame中绘制,但如果您绝对必须(而且您不需要),至少可以调用super的绘制方法:

public void paint(Graphics g) {
    super.paint(g);
    // Something to go here
}
更好的方法是——永远不要覆盖绘制,而是在JPanel的
paintComponent
方法中绘制(仍然在中调用super的paintComponent方法),并在JFrame中显示该JPanel

关键环节:

  • :Swing图形的入门教程
  • :Swing图形高级教程


我不确定您的代码的其余部分试图做什么,但您有大的线程问题,其他绘画问题,。。。一定要阅读教程以避免猜测。你也会想要学习和使用。变量名都应该以小写字母开头,而类名应该以大写字母开头。学习并遵循这一点可以让我们更好地理解您的代码,也可以让您更好地理解其他人的代码。

“在大量搜索之后……”
——您还应该找到该链接,特别是其中包含的“如何提问”和链接。请阅读这些,然后改进这个问题,使其更容易回答。我删除了不相关的杂乱无章的东西,请重新阅读链接--我们不能直接复制、编译和运行此代码,因为没有类主体、没有主方法、没有导入。。。您缺少了MCVE链接声明您需要的所有组件。很抱歉,这是一个很大的类,出于懒惰,我刚刚抓住了相关区域并删除了不相关的代码。我已经为这个例子修改了这个类,以便它可以按原样运行。“它是一个大类”:总是发布。(编写最小大小写是一种很好的调试技术。这样做可能会解决您的问题。)我没有使用super.paint(g),而是使用initialize、clearbackuffer和traffackbuffertoscreen方法创建了自己的缓冲区方法。避免使用super.paint(g),这样在重新绘制这么多内容时不会出现闪烁,因此相对于我的代码,此解决方案不起作用(如果我不更新/重新绘制,它会起作用,但我是)@kriller509:你读过我说的任何内容吗?你做错了,从直接在JFrame中绘图开始。你上面的“解决方案”不好,不要这样做。从从不直接在JFrame中绘制开始。您可以使用JPanel的
paintComponent
为您提供的双缓冲来避免闪烁。@HoverCraftFullOfels是对的,您在这里做了一些错误的事情。@kriller509:在做任何其他事情之前,请检查我添加到我的答案中的链接,尤其是第二个链接。它将为你提供充分理解问题所需的所有细节。除了你对明显有困难的人发表屈尊俯就的评论之外,我发现你的回答总体上是有帮助的。谢谢你,我猜?