Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 游戏主菜单_Java_Swing - Fatal编程技术网

Java 游戏主菜单

Java 游戏主菜单,java,swing,Java,Swing,我是一个尝试创建游戏的初学者。游戏是空的,我没有开始写 我的问题是:当我点击“开始”按钮时,我想在同一帧中开始游戏,但当我点击“开始”时,程序会用菜单打开另一帧,并在原始帧中删除面板 我怎么做这个简单的菜单 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.File; import panelimage.Image; public class Project0 extends JFr

我是一个尝试创建游戏的初学者。游戏是空的,我没有开始写

我的问题是:当我点击“开始”按钮时,我想在同一帧中开始游戏,但当我点击“开始”时,程序会用菜单打开另一帧,并在原始帧中删除面板

我怎么做这个简单的菜单

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import panelimage.Image;

public class Project0 extends JFrame{
private static final long serialVersionUID = 1L;
private Game JPanelGame;
private Image MainMenu = new Image(new File("src/img/menu_background.jpg"));
JButton start = new JButton("START GAME"), exit = new JButton ("LEAVE GAME");

public Project0() {

    super();

    initFrame();
    initMenu();

    this.addKeyListener(new KeyAdapter() {

        public void keyPressed(KeyEvent evt) {
            JPanelGame.keyPressed(evt);
        }

        public void keyReleased(KeyEvent evt) {
            JPanelGame.keyReleased(evt);
        }            
    });

}


private void initFrame() {

    setResizable(false);
    setBounds(new Rectangle(400, 400, 600, 400));
    MainMenu.setLayout(new BorderLayout()); 
}


private void initMenu() {

    initButtons();

    MainMenu.setLayout(null);       
    MainMenu.add(start);
    MainMenu.add(exit);

    add(MainMenu);      
    setContentPane(MainMenu);

    setTitle("Project0");

}

private void initButtons() {

    start.addActionListener(new ActionListener() {  

        public void actionPerformed(ActionEvent e){

            JPanelGame = new Game();

            remove(MainMenu);

            add(JPanelGame, BorderLayout.CENTER);
            setContentPane(JPanelGame);

            invalidate(); validate();

            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Project0 Game = new Project0();
                    Game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    Game.setVisible(true);
                }
            });
        }
    });      

    start.setLocation(225,100);
    start.setSize(150,50);

    exit.addActionListener(new ActionListener() {   

        public void actionPerformed(ActionEvent e){

            System.exit(0);
        }
    });

    exit.setLocation(225,200);
    exit.setSize(150,50);       

}


public static void main(String[] args) {    
    Project0 Game = new Project0();
    Game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Game.setVisible(true);

}
}

这个框架将启动

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;

import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

import highscores.*;


public class Game extends JPanel implements Runnable {

private static final long serialVersionUID = 1L;    

Thread game;
BufferedImage background;
HighscoreManager scores = new HighscoreManager();

public Game(){

    super(true);
    try{
        background = ImageIO.read(new File(""));
    }catch(Exception e) {}


    game=new Thread(this);
    game.start();
}

public void paintComponent(Graphics graphic2d){

    setOpaque(false);       
    super.paintComponent(graphic2d);      

    graphic2d.drawImage(background, 0, 0, null);
}   

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {

    }

    if (key == KeyEvent.VK_RIGHT) {

    }

    if (key == KeyEvent.VK_UP) {

    }

    if (key == KeyEvent.VK_DOWN) {

    }

    if (key == KeyEvent.VK_A) {

    }

    if (key == KeyEvent.VK_D) {

    }

    if (key == KeyEvent.VK_W) {

    }

    if (key == KeyEvent.VK_S) {

    }
}

public void keyReleased(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {

    }

    if (key == KeyEvent.VK_RIGHT) {

    }

    if (key == KeyEvent.VK_UP) {

    }

    if (key == KeyEvent.VK_DOWN) {

    }

    if (key == KeyEvent.VK_A) {

    }

    if (key == KeyEvent.VK_D) {

    }

    if (key == KeyEvent.VK_W) {

    }

    if (key == KeyEvent.VK_S) {

    }
}


public void run(){

        try {Thread.sleep(50);}catch(InterruptedException ex){}     
}

}

当您在按钮的动作侦听器中调用
SwingUtilities.invokeLater()
时,您正在创建第二个
Project0
对象。无论何时创建一个
项目0
,都会在屏幕上绘制一个JFrame,其中包含一个主菜单。删除对
SwingUtilities.invokeLater()
的调用,您应该只剩下一个框架。

我看到两个选项,具体取决于您的需要。要么从框架中删除所有组件,然后添加新内容。但这样做,你就失去了“菜单框”。另一种选择(我认为这两种选择中最好的一种)是选择
卡片布局
,其中一张是你的菜单,另一张是你的游戏。然后,“开始”按钮将简单地从“菜单卡”切换到“游戏卡”(如果需要,启动游戏)。在你的游戏中,你可以有一个按钮/键/。。。哪一个相反(从游戏卡切换到菜单卡)

我正在检查您的代码,但我放弃了(当然是因为@orzechowskid已经指出了您需要调整的内容)。如果您打算在此网站上发布更多代码,请提供一些提示:

  • 阅读该网站,并试着按照上面的描述发布代码
  • 遵循(例如,类以大写字母开头,变量以小写字母开头)
  • 不要给自己的类指定与标准JDK类相同的名称。使不熟悉您的代码(但可能相当熟悉JDK类)的人很难阅读代码。例如,我花了一些时间才意识到您有自己的
    panelimage.Image
    类,它与
    java.awt.Image
    类无关
  • 然后是一些与Swing相关的技巧,这些技巧基于我对您的代码的了解:

  • 了解如何使用
    LayoutManager
    s并摆脱
    null
    布局。这可能是一个很好的起点
  • Swing设计用于键绑定,而不是键侦听器。见
  • 小心使用
    线程。睡眠
    使用,并结合Swing UI运行多个
    线程
    s。确保您知道