如何使开始按钮启动游戏?

时间:2018-10-19 22:13:09

标签: java swing

我正在制作这个游戏,我为它创建了一个菜单,该菜单在启动程序时首先打开,但是菜单按钮不会做任何事情。如何将此菜单窗口链接到游戏,以便当我按“新游戏”时游戏开始?

P.S 是的,我确实尝试从几个youtube视频和Java自己的帮助站点中找到解决方案,但我找不到如何链接按钮单击动作来启动游戏中的动作的方法,因此它基本上可以打开游戏屏幕并开始游戏。

所有帮助将不胜感激!

代码:

 public class Menu {
JTextArea output;
JScrollPane scrollPane;

public JMenuBar createMenuBar() {
    JMenuBar menuBar;
    JMenu menu, submenu;
    JMenuItem menuItem;
    JRadioButtonMenuItem rbMenuItem;
    JCheckBoxMenuItem cbMenuItem;

    //Create the menu bar.
    menuBar = new JMenuBar();

    //Build the first menu.
    menu = new JMenu("Menu");
    menu.setMnemonic(KeyEvent.VK_A);
    menu.getAccessibleContext().setAccessibleDescription(
            "The only menu in this program that has menu items");
    menuBar.add(menu);

    //a group of JMenuItems
    menuItem = new JMenuItem("New Game",
                             KeyEvent.VK_T);
    //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
    menuItem.setAccelerator(KeyStroke.getKeyStroke(
            KeyEvent.VK_1, ActionEvent.ALT_MASK));
    menuItem.getAccessibleContext().setAccessibleDescription(
            "This doesn't really do anything");
    menu.add(menuItem);

    ImageIcon icon = createImageIcon("");
    menuItem = new JMenuItem("Score history", icon);
    menuItem.setMnemonic(KeyEvent.VK_B);
    menu.add(menuItem);

    menuItem = new JMenuItem(icon);
    menuItem.setMnemonic(KeyEvent.VK_D);
    menu.add(menuItem);

    //a submenu
    menu.addSeparator();
    submenu = new JMenu("Options");
    submenu.setMnemonic(KeyEvent.VK_S);

    menuItem = new JMenuItem("Sounds");
    menuItem.setAccelerator(KeyStroke.getKeyStroke(
            KeyEvent.VK_2, ActionEvent.ALT_MASK));
    submenu.add(menuItem);

    menuItem = new JMenuItem("Exit Game");
    submenu.add(menuItem);
    menu.add(submenu);

    //Build second menu in the menu bar.


    return menuBar;
}

public Container createContentPane() {
    //Create the content-pane-to-be.
    JPanel contentPane = new JPanel(new BorderLayout());
    contentPane.setOpaque(true);

    //Create a scrolled text area.
    output = new JTextArea(5, 30);
    output.setEditable(false);
    scrollPane = new JScrollPane(output);

    //Add the text area to the content pane.
    contentPane.add(scrollPane, BorderLayout.CENTER);

    return contentPane;
}

/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = Menu.class.getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}


private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("BlockBreaker");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    Menu demo = new Menu();
    frame.setJMenuBar(demo.createMenuBar());
    frame.setContentPane(demo.createContentPane());

    //Display the window.
    frame.setSize(450, 260);
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

这就是我在脑海中的想象:

        menuItem.setAccelerator(KeyStroke.getKeyStroke(
            KeyEvent.VK_1, ActionEvent.ALT_MASK));
        menuItem.getAccessibleContext().setAccessibleDescription(
            "This doesn't really do anything");
        menu.add(menuItem);

        menuItem = new MouseAction(MouseEvent.PRESS_LMB)
            if (PRESS_LMB.menuItem("New Game")) {
                start Gameplay.java;
            }

2 个答案:

答案 0 :(得分:1)

AbstractAction类与JMenuItem一起使用,如下所示。

替换您的代码行:

menuItem = new JMenuItem("New Game", KeyEvent.VK_T);

通过:

menuItem = new JMenuItem((new AbstractAction("New Game") {
    public void actionPerformed(ActionEvent e) {
        System.out.print("clicked");
    }
}));

答案 1 :(得分:0)

  • 为不同的游戏菜单使用单独的名称,否则您将无法对它们添加不同的操作。
  • 使用匿名类或ActionListener执行的操作。我正在参加匿名课程。

有关更多信息,请参见此:How to use JMenu

  

使用匿名课程:

final JMenuItem newGame;
newGame = new JMenuItem("New Game",
                         KeyEvent.VK_T);
menu.add(newGame);
newGame.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        JFrame frame = new JFrame();
        frame.setSize(500, 100);
        frame.setTitle("Game on Fire");
        frame.show();
    }
});
  

使用ActionListener:

public YourClass implements ActionListener, ItemListener {
@Override
public void actionPerformed(ActionEvent e) {
    //...Get information from the action event...
    //...Display it in the text area...
}
}

如果要在同一窗口上运行游戏,请在actionPerformed中使用JPanel。这是一个示例:

public class GameClass extends JPanel{
    ///Game Logic Here
}

然后将其也添加到您的actionPerformed

public void actionPerformed(ActionEvent e) {
    GameClass game = new GameClass();
    menuPanel.setVisible(false); /// menuPanel is a selection window.
    mainPanel.add(game); // Now add your Game Window to same Frame.     
}