等待按下jbutton

jei2mxaa  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(338)

我是java编程新手。
我想为我的游戏做一份菜单。我使用swing作为gui。我已经做了必要的框架。
程序从主菜单开始,主菜单应该等待jbutton被按下。我已经为每个jbutton创建了actionlistener,但是我无法让程序等待其中一个按钮被按下。
我希望我的菜单是这样的:
如果你按下newgameb,菜单框关闭,游戏框开始动作。如果您按下exitb,程序将自动关闭。
我读过关于使用wait()和notifyall()的文章,但是我无法使程序正常工作。

public class Main {
public enum CurrentState{
    MENU, GAME, EXIT
}

public static void main(String[] args) {
    CurrentState currentState = CurrentState.MENU;
    boolean isRunning = true;
    while(isRunning) {
        switch(currentState) {
        case MENU:
            Menu menu = new Menu();
            menu.runMenu(currentState);
            break;
        case EXIT:
            isRunning = false;
            break;
        case GAME:
            System.out.println("game");
            PlayGame game = new PlayGame();
            game.runGame(currentState);
            break;
        default:
            System.exit(0);
            break;
        }
    }
}

}

public class MenuFrame extends Frame {
CurrentState currentState;

JPanel panel = new JPanel();
FlowLayout layout = new FlowLayout();
JLabel emptyLabel = new JLabel();

JButton continueGameB = new JButton("Folytatás");
JButton newGameB = new JButton("Új játék");
JButton scoresB = new JButton("Eredmények");
JButton exitB = new JButton("Kilépés");

public void setCurrentState(CurrentState state) {
    currentState = state;
}

public MenuFrame(CurrentState currentState) {
    this.currentState = currentState;

    frame.getContentPane().add(emptyLabel);

    emptyLabel.setPreferredSize(new Dimension(175, 100));

    panel.setLayout(layout);
    panel.setBackground(background);

    panel.add(continueGameB);
    panel.add(newGameB);
    panel.add(scoresB);
    panel.add(exitB);
    frame.add(panel, BorderLayout.SOUTH);
}

public void runFrame() {
    openFrame();
    exitB.addActionListener(new ButtonListener());
    newGameB.addActionListener(new ButtonListener());
}

private class ButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == exitB) {
            setCurrentState(CurrentState.EXIT);
        } 
        else if(e.getSource() == newGameB) {
            setCurrentState(CurrentState.GAME);
        }
    }
}

}

public class Menu {
MenuFrame menuFrame;

public void runMenu(CurrentState currentState) {
    this.menuFrame = new MenuFrame(currentState);
    menuFrame.runFrame();
}

}

public class Frame {
JFrame frame;
Color background = new Color(255, 255, 255, 255);

public Frame() {
    frame = new JFrame("Progházi");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //frame.setUndecorated(true);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setSize(screenSize.width, screenSize.height);
    frame.getContentPane().setBackground(background);
}

public void openFrame() {
    frame.pack();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true);
}

public void closeFrame() {
    frame.dispose();
}

}

vjrehmav

vjrehmav1#

您可以使用易失性布尔变量,当jbutton上发生actionevent时,该变量被设置为true。考虑到这一点,您的代码中可以有一个while循环执行的部分,直到按下其中一个按钮。
此外,您可以有多个布尔变量来检测按下了哪个按钮,并基于此调用某些方法。

相关问题