Java菜单栏隐藏背景图像

标签 java swing jframe jlabel menubar

您好,我正在按照在线教程用 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 的特定组件,因此您的术语非常令人困惑,试图理解您真正在做什么。

我发现很多不一致的地方:

  1. 你不应该重写paint()。
  2. 您不应该使用 null 布局或 setBounds()。
  3. 您不应该直接调用paintComponents()。
  4. 您不应该在绘画方法调用的方法中调用 repaint()。基本上你正在创建一个无限循环。
  5. 您不应该使用 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/

相关文章:

java - 如何为我的 Tic Tac Toe GUI 游戏制作正确的重启按钮?

java - 自定义 JTable 的列标题

swing - 获取 null/空 JtextArea

java - 当关闭 JFrame 时,程序中的所有内容都会终止吗?

java - 如何检查字符串是否纯粹是字母?

java - 我的组件不会显示在 JFrame 上以及如何隐藏另一个框架

java - 构建 monad 时 Java 泛型的问题

java - kafka-run-class错误找不到或加载主类

java - 部署可以自行停止吗?

java - 在 Spark 上下文中创建计时器