我正在做一个简单的游戏。我有一个称为GraphicalInterface的类,还有一个JFrame类FrmMain,它在单击FrmMain中的JButton btnNewGame时用一些我希望从FrmMain发送到GraphicalInterface的值扩展了GraphicalInterface。但是,当我打开FrmMain对象选择设置时,我需要后续代码等待btnNewGame被单击并且FrmMain关闭。

我搜索了包括StackOverflow在内的内容,但是没有找到任何相关的解决方案。我目前最好的想法是使用对话框,但是我不确定它是否适合我的菜单或在这种情况下如何实现它,因为以前从未使用过它。
此外,我想将这个问题的解决方案用于另一个称为FrmGame的JFrame,该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的图片。

java - JFrame:WAITING表单上的按钮按下以接收类中的值并继续-LMLPHP

因此,如何将JFrame中的值检索到主GUI类GraphicalInterface中,将代码挂起,直到单击“新建游戏”按钮?

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

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

最佳答案

通常,如果您需要代码等待从用户那里收集信息,则应该使用模式对话框,它可以让您从用户那里收集少量信息,同时阻止代码执行。对话框变为可见,直到关闭。

查看How to Make Dialogs了解更多详细信息

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

一般来说,您不应该从JFrameJDialog之类的顶级容器扩展而来,而是将UI表单基于诸如JPanel之类的东西,通过这种方式,您可以将它们添加到所需的任何容器中。

07-24 19:51