Java setJMenuBar不工作
经过大量的谷歌搜索,我发现这个问题通常是针对具体情况的。我已经尝试了很多找到的解决方案,但没有一个对我有效,所以我觉得在上面写一篇帖子是合适的 我正在使用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
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:在做任何其他事情之前,请检查我添加到我的答案中的链接,尤其是第二个链接。它将为你提供充分理解问题所需的所有细节。除了你对明显有困难的人发表屈尊俯就的评论之外,我发现你的回答总体上是有帮助的。谢谢你,我猜?