我正在做一个简单的游戏。我有一个称为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的图片。
因此,如何将JFrame中的值检索到主GUI类GraphicalInterface中,将代码挂起,直到单击“新建游戏”按钮?
注意:
当前,FrmMain扩展了几个类,这些类最终导入了javax.swing.JFrame。我不知道FrmMain是否需要扩展GraphicalInterface还是应该直接直接扩展JFrame。
用于实现接口IOInterface的GraphicalInterface。现在,IOInterface是一个抽象类,因此我可以使用GraphicalInterface和另一个类可以继承的字段。
最佳答案
通常,如果您需要代码等待从用户那里收集信息,则应该使用模式对话框,它可以让您从用户那里收集少量信息,同时阻止代码执行。对话框变为可见,直到关闭。
查看How to Make Dialogs了解更多详细信息
您将需要设计一个解决方案,该解决方案允许您的代码从其他表单中获取信息,还可以确定用户何时取消或关闭了窗口。
一般来说,您不应该从JFrame
或JDialog
之类的顶级容器扩展而来,而是将UI表单基于诸如JPanel
之类的东西,通过这种方式,您可以将它们添加到所需的任何容器中。