我是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();
}
}
1条答案
按热度按时间vjrehmav1#
您可以使用易失性布尔变量,当jbutton上发生actionevent时,该变量被设置为true。考虑到这一点,您的代码中可以有一个while循环执行的部分,直到按下其中一个按钮。
此外,您可以有多个布尔变量来检测按下了哪个按钮,并基于此调用某些方法。