您好,我正在按照在线教程用 Java 制作节奏游戏,但在显示菜单栏时遇到问题。当我执行程序时,菜单栏似乎覆盖了背景图像,我看到的只是屏幕顶部的菜单栏和其下方的黑屏。看起来该代码在 Windows 上可以运行,但在 Mac 上却无法运行。有人知道如何解决这个问题吗?
package dynamic_beat_4;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class DynamicBeat extends JFrame {
private Image screenImage;
private Graphics screenGraphic;
private Image introBackground = new ImageIcon(Main.class.getResource("../images/introBackground.jpg")).getImage();
private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png")));
public DynamicBeat() {
setUndecorated(true);
setTitle("Dynamic Beat");
setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setBackground(new Color(0, 0, 0, 0));
setLayout(null);
menuBar.setBounds(0, 0, 1280, 30);
add(menuBar);
Music introMusic = new Music("intromusic.mp3", true);
introMusic.start();
}
public void paint(Graphics g) {
screenImage = createImage(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
screenGraphic = screenImage.getGraphics();
screenDraw(screenGraphic);
g.drawImage(screenImage, 0, 0, null);
}
public void screenDraw(Graphics g) {
g.drawImage(introBackground, 0, 0, null);
paintComponents(g);
this.repaint();
}
}
最佳答案
为什么称其为“菜单栏”?它是一个 JLabel。 Swing 有一个称为 JMenuBar 的特定组件,因此您的术语非常令人困惑,试图理解您真正在做什么。
我发现很多不一致的地方:
- 你不应该重写paint()。
- 您不应该使用 null 布局或 setBounds()。
- 您不应该直接调用paintComponents()。
- 您不应该在绘画方法调用的方法中调用 repaint()。基本上你正在创建一个无限循环。
- 您不应该使用 getGraphics()。如果您需要进行自定义绘画,那么您只需使用传递给绘画方法的 Graphics 对象即可。
不太确定您要做什么,但我建议您只需要使用框架的默认 BorderLayout 即可。那么基本代码是:
add(menuBar, BorderLayout.PAGE_START);
add(introBackground, BorderLayout.CENTER)
pack();
setVisible( true );
阅读 Swing 教程中关于 How to Use BorderLayout 的部分了解更多信息和工作示例以帮助您入门。
关于Java菜单栏隐藏背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56028383/