JFrame:在表单上等待按钮按下以在课堂上接收值并继续

时间:2015-12-21 22:38:31

标签: java swing jframe mouseevent

我正在做一个简单的游戏。我有一个名为GraphicalInterface的类,以及一个JFrame类FrmMain,当点击FrmMain中的JButton btnNewGame时,它扩展了GraphicalInterface以及我想从FrmMain发送到GraphicalInterface的值。但是,当我打开FrmMain对象来选择设置时,我需要等待后续代码,直到单击btnNewGame并关闭FrmMain。

我已经搜索过StackOverflow,但我没有找到任何相关的解决方案。我现在最好的想法是使用一个对话框,但我不相信它适合我的菜单,或者在这种情况下我应该如何实现它,以前从未使用过它。 此外,我想为另一个名为FrmGame的JFrame使用这个问题的解决方案,它也应该在某些输入上向GraphicalInterface发送值,但是当它这样做时不会自动关闭。

以下是GraphicalInterface的相关代码,它是抽象类IOInterface的子类。

public class GraphicalInterface extends IOInterface{
protected FrmMain mainMenu;
protected FrmGame gameInterface;
private Settings settings;

@Override
public void initialise(){
    round = new Round(ioInterface);
    round.initialise(getSettings());

    board = round.getBoard();
    turnCount = round.getTurnCount();
    turnCount++;
    round.setTurnCount(turnCount);
    displayBoard();
}

@Override
public Settings getSettings() {
    openMainMenu();
    return settings;
}

@Override
public void playTurn() {
    while (!round.getGameOver()) {
        round.guess();
        turnCount++;
    }
}

private void openMainMenu(){
    if (mainMenu == null){
        mainMenu = new FrmMain();
    }
    mainMenu.setVisible(true);
    mainMenu.toFront();

    //I need the code to wait here for the user to pick their settings on 
    //FrmMain and press btnNewGame before the settings below are retrieved from it


    int pegCount = mainMenu.sldPegs.getValue();
    int colourCount = mainMenu.sldColours.getValue();
    int mode = mainMenu.lstMode.getSelectedIndex();

    settings = new Settings(pegCount, colourCount, mode);
    settings.calculateRows();
    }
}

以下是FrmMain的代码

public class FrmMain extends GraphicalInterface{
private JPanel contentPane;

JButton btnNewGame;

public FrmMain() {
    setTitle("Mastermind");
    setResizable(false);
    initialiseComponents();
}

private void updateToolTips() {
    int mode = lstMode.getSelectedIndex();

    if (mode == 0 || mode == 1)
        lblToolTipA.setText("Human Codebreaker");
    else lblToolTipA.setText("AI Codebreaker");

    if (mode == 1 || mode == 3)
        lblToolTipB.setText("AI Codemaker");
    else lblToolTipB.setText("Human Codemaker");
 }

private void btnNewGameClick(){
    this.dispose();
}

private void initialiseComponents() {
    try {
        UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }
    catch (Throwable e) {
        e.printStackTrace();
    }
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 321, 387);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    btnNewGame = new JButton("New Game");
    btnNewGame.addMouseListener(new MouseAdapter() {
        public void mouseReleased(MouseEvent arg0) {
            btnNewGameClick();
        }
    });
    btnNewGame.setFont(new Font("Segoe UI", Font.PLAIN, 13));
    btnNewGame.setBounds(155, 188, 137, 25);
    contentPane.add(btnNewGame);
    }
}

这是我不完整的FrmMain的照片。

enter image description here

那么,我应该如何将JFrame中的值检索到主GUI类GraphicalInterface中,暂停代码直到单击New Game按钮?

注意: 目前,FrmMain扩展了几个类,最终导入了javax.swing.JFrame。我不知道FrmMain是否需要扩展GraphicalInterface,或者它是否应该直接扩展JFrame。

GraphicalInterface用于实现接口IOInterface。现在,IOInterface是一个抽象类,所以我可以使用GraphicalInterface和另一个类可以继承的字段。

1 个答案:

答案 0 :(得分:2)

通常,如果您需要等待代码从用户收集信息时应该使用模态对话框,它允许您从用户收集少量信息,同时阻止代码执行对话框变为可见的点,直到它被关闭。

请查看How to Make Dialogs了解详情

您需要设计一个解决方案,允许您的代码从其他表单中获取信息,同时确定用户何时取消或关闭窗口。

一般来说,您不应该从JFrameJDialog这样的顶级容器进行扩展,而是将您的UI表单基于JPanel这样的方式,这样就可以添加它们到你想要的容器。