Java 我想把游戏放在一个JPane上,而不是放在一个JFrame上,这样我就可以通过使用GUI访问它,但是它不会工作

Java 我想把游戏放在一个JPane上,而不是放在一个JFrame上,这样我就可以通过使用GUI访问它,但是它不会工作,java,swing,jframe,jpanel,graphics2d,Java,Swing,Jframe,Jpanel,Graphics2d,如果没有问题,无法将游戏放入GUI。启动GUI时,它会显示游戏。它会出现故障,只有在按下按钮后才能修复。但是,按钮是隐藏的,除非你把鼠标放在上面。代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.util.*; publ

如果没有问题,无法将游戏放入GUI。启动GUI时,它会显示游戏。它会出现故障,只有在按下按钮后才能修复。但是,按钮是隐藏的,除非你把鼠标放在上面。代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.*;
public class BBSays extends JFrame implements ActionListener, MouseListener 
{
    private BufferedImage image;
    public static BBSays bbsays;
    public Renderer renderer;
    public static final int WIDTH = 800, HEIGHT = 800;
    public int flashed = 0, glowTime, dark, ticks, indexPattern;
    public boolean creatingPattern = true;  
    public ArrayList<Integer> pattern;
    public Random random;
    private boolean gameOver;
    private JPanel game;
    JFrame frame = new JFrame("BB8 Says");
    private JPanel menu;
    private JPanel credits;
    ImageIcon bbegif = new ImageIcon("tumblr_o0c57n9gfv1tha1vgo1_r3_250.gif");


    public BBSays()
    {

        Timer timer = new Timer(20, this);
        renderer = new Renderer();
        frame.setSize(WIDTH +7, HEIGHT +30);
        frame.setVisible(true);
        frame.addMouseListener(this);
        frame.add(renderer);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
        start();
        timer.start();
        menu = new JPanel();
        credits = new JPanel();
        game = new JPanel();
        menu.setBackground(Color.yellow);
        credits.setBackground(Color.yellow);
        game.setBackground(Color.yellow);
        JButton button = new JButton("Start");
        JButton button2 = new JButton("Exit");
        JButton button4 = new JButton("Start");
        JLabel greet = new JLabel("                       Welcome to BB8 Says");
        JLabel jif = new JLabel(bbegif);
        JLabel jif2 = new JLabel(bbegif);
        JLabel saus = new JLabel("BB8 Image: https://49.media.tumblr.com/7ba3be87bff2efc009e9cfa889d46b4e/tumblr_o0c57n9gfv1tha1vgo1_r3_250.gif");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                frame.setContentPane(game);
                frame.invalidate();
                frame.validate();
            };
        });
        button2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.exit(0);
            };
        });
        menu.setLayout(new GridLayout(2,2));
        menu.add(jif2);
        menu.add(greet);
        menu.add(jif);
        menu.add(button);
        menu.add(button6);
        menu.add(button2);
        frame.setVisible(true);     
    }

    private class MenuAction implements ActionListener {
        private JPanel panel;
        private MenuAction(JPanel pnl) {
            this.panel = pnl;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            changePanel(panel);
        }
    }
    private void changePanel(JPanel panel) {
        getContentPane().removeAll();
        getContentPane().add(panel, BorderLayout.CENTER);
        getContentPane().doLayout();
        update(getGraphics());
    }
    public void start()
    {
        random = new Random();
        pattern = new ArrayList<Integer>();
        indexPattern = 0;
        dark = 2;
        flashed = 0;
        ticks = 0;
    }

    public static void main(String[] args)
    {
        bbsays = new BBSays();
    }

    @Override
    public void actionPerformed(ActionEvent e) 
    {
        ticks++;

        if (ticks % 20 == 0)
        {
            flashed = 0;

            if (dark >= 0)
            {
                dark--;
            }
        }

        if (creatingPattern)
        {
            if (dark <= 0)
            {
                if (indexPattern >= pattern.size())
                {
                    flashed = random.nextInt(40) % 4 + 1;
                    pattern.add(flashed);
                    indexPattern = 0;
                    creatingPattern = false;
                }
                else
                {
                    flashed = pattern.get(indexPattern);
                    indexPattern++;
                }

                dark = 2;
            }
        }
        else if (indexPattern == pattern.size())
        {
            creatingPattern = true;
            indexPattern = 0;
            dark = 2;
        }

        renderer.repaint();
    }

    public void paint(Graphics2D g) 
    {   
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.yellow);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        if (flashed == 1)
        {
            g.setColor(Color.blue);
        }
        else
        {
            g.setColor(Color.blue.darker());
        }
        g.fillRect(0, 0, WIDTH/2, HEIGHT/2);

        if (flashed == 2)
        {
            g.setColor(Color.green);
        }
        else
        {
            g.setColor(Color.green.darker());
        }
        g.fillRect(WIDTH/2, 0, WIDTH/2, HEIGHT/2);

        if (flashed == 3)
        {
            g.setColor(Color.orange);
        }
        else
        {
            g.setColor(Color.orange.darker());
        }
        g.fillRect(0, HEIGHT/2, WIDTH/2, HEIGHT/2);

        if (flashed == 4)
        {
            g.setColor(Color.gray);
        }
        else
        {
            g.setColor(Color.gray.darker());
        }
        g.fillRect(WIDTH/2, HEIGHT/2, WIDTH/2, HEIGHT/2);

        g.setColor(Color.BLACK);
        g.fillRoundRect(220, 220, 350, 350, 300, 300);
        g.fillRect(WIDTH/2 - WIDTH/14, 0, WIDTH/7, HEIGHT);
        g.fillRect(0, WIDTH/2 - WIDTH/12, WIDTH, HEIGHT/7);

        g.setColor(Color.yellow);
        g.setStroke(new BasicStroke(200));
        g.drawOval(-100, -100, WIDTH+200, HEIGHT+200);

        g.setColor(Color.black);
        g.setStroke(new BasicStroke(5));
        g.drawOval(0, 0, WIDTH, HEIGHT);



        if (gameOver)
        {
            g.setColor(Color.WHITE);
            g.setFont(new Font("Comic Sans", 1, 80));
            g.drawString("You let", WIDTH / 2 - 140, HEIGHT / 2 - 70);
            g.drawString("down BB8 :(", WIDTH / 2 - 220, HEIGHT / 2 );
            g.drawString("Try again!", WIDTH / 2 - 195, HEIGHT / 2 + 80);
        }
        else
        {
            g.setColor(Color.WHITE);
            g.setFont(new Font("Ariel", 1, 144));
            g.drawString(indexPattern + "/" + pattern.size(), WIDTH / 2 - 100, HEIGHT / 2 + 42);
        }


    }

    @Override
    public void mousePressed(MouseEvent e) 
    {
        int x = e.getX(), y = e.getY();

        if (!creatingPattern && !gameOver)
        {
            if (x>0 && x<WIDTH/2 && y>0 && y<HEIGHT/2)
            {
                flashed = 1;
                ticks = 1;
            }
            else if (x>WIDTH/2 && x<WIDTH && y>0 && y<HEIGHT/2)
            {
                flashed = 2;
                ticks = 1;
            }
            else if (x>0 && x<WIDTH/2 && y>HEIGHT/2 && y<HEIGHT)
            {
                flashed = 3;
                ticks = 1;
            }
            else if (x>WIDTH/2 && x<WIDTH && y>HEIGHT/2 && y<HEIGHT)
            {
                flashed = 4;
                ticks = 1;
            }
            if (flashed != 0)
            {
                if (pattern.get(indexPattern)==flashed)
                {
                indexPattern++;
                }
                else
                {
                    gameOver = true;
                }
            }
            else
            {
                start();
                gameOver = true;
            }
        }
        else if (gameOver)
        {
            start();
            gameOver = false;
        }
    }
我认为问题就在这里,因为我使用了
super.
方法,希望将
游戏
JPanel中的图形放在主代码中。我尝试了很多方法,但是我不能把游戏放到JPanel上。

如果您能提供帮助,我们将不胜感激。

1)请使用中所示的。2) 为了更快地获得更好的帮助,请发布一个or。3) 例如,获取图像的一种方法是热链接到……中看到的图像。。。。4) 应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。5)
公共类BBSays扩展JFrame实现。。public void paint(Graphics2D g)
此代码似乎既可以自定义绘制框架,也可以添加可能覆盖内容窗格整个区域的组件。这是灾难的秘诀@AndrewThompson你建议我如何解决这个问题?@AndrewThompson有没有办法将图形2D放到JPanel上,如果没有的话,我需要做什么。@AndrewThompson有没有办法将GUI和游戏分开,然后一个接一个地运行,例如,当按下start时,GUI的JFrame关闭,游戏的JFrame打开?1)使用如中所示的。2) 为了更快地获得更好的帮助,请发布一个or。3) 例如,获取图像的一种方法是热链接到……中看到的图像。。。。4) 应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。5)
公共类BBSays扩展JFrame实现。。public void paint(Graphics2D g)
此代码似乎既可以自定义绘制框架,也可以添加可能覆盖内容窗格整个区域的组件。这是灾难的秘诀@AndrewThompson你建议我如何解决这个问题?@AndrewThompson有没有办法将图形2D放到JPanel上,如果没有的话,我需要做什么。@AndrewThompson有没有办法将GUI和游戏分开,然后一个接一个地运行,例如,当按下start时,GUI的JFrame关闭,游戏的JFrame打开?
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class Renderer extends JPanel
{

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (BBSays.bbsays != null)
        {
        BBSays.bbsays.paint((Graphics2D) g);
        }
    }

}