Java менубар скрывается фоновое изображение - PullRequest
0 голосов
/ 07 мая 2019

Привет! Я слежу за онлайн-руководством по созданию ритм-игры на 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 голосов
/ 07 мая 2019

Почему вы называете это "менубар"? Это JLabel. В Swing есть специальный компонент, называемый JMenuBar, поэтому ваша терминология очень запутанная, пытаясь понять, что вы на самом деле делаете.

Я вижу много несоответствий:

  1. Вы НЕ должны переопределять краску ().
  2. Вы НЕ должны использовать пустой макет или setBounds ().
  3. Вы НЕ должны вызывать paintComponents () напрямую.
  4. Вы НЕ должны вызывать repaint () в методе, вызываемом из метода рисования. По сути, вы создаете бесконечный цикл.
  5. Вы НЕ должны использовать getGraphics (). Если вам когда-либо понадобится выполнить произвольную отрисовку, тогда вы просто используете объект Graphics, переданный методу рисования.

Не совсем уверен, что вы пытаетесь сделать, но я бы посоветовал вам все, чтобы использовать дефрагментацию BorderLayout фрейма. Тогда основной код:

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

Прочтите раздел из учебника по Swing на Как использовать BorderLayout для получения дополнительной информации и рабочих примеров для начала работы.

...