Java菜单栏隐藏背景图像

时间:2019-05-07 18:16:06

标签: 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(); 
    }

}

1 个答案:

答案 0 :(得分:0)

您为什么称其为“菜单”?这是一个JLabel。 Swing有一个称为JMenuBar的特定组件,因此您在理解自己的实际工作时会感到非常困惑。

我看到许多不一致之处:

  1. 您不应覆盖paint()。
  2. 您不应使用null布局或setBounds()。
  3. 您不应直接调用paintComponents()。
  4. 您不应在通过绘画方法调用的方法中调用repaint()。基本上,您正在创建一个无限循环。
  5. 您不应使用getGraphics()。如果您需要自定义绘画,则只需使用传递给绘画方法的Graphics对象即可。

不是很确定您要尝试做什么,但我建议您使用框架的默认Defender BorderLayout即可。那么基本代码是:

add(menuBar, BorderLayout.PAGE_START);
add(introBackground, BorderLayout.CENTER)
pack();
setVisible( true );

阅读How to Use BorderLayout的Swing教程中的这一节,以获取更多信息和工作示例,以帮助您入门。