我正在做一个简单的游戏。我有一个名为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的照片。
那么,我应该如何将JFrame中的值检索到主GUI类GraphicalInterface中,暂停代码直到单击New Game按钮?
注意: 目前,FrmMain扩展了几个类,最终导入了javax.swing.JFrame。我不知道FrmMain是否需要扩展GraphicalInterface,或者它是否应该直接扩展JFrame。
GraphicalInterface用于实现接口IOInterface。现在,IOInterface是一个抽象类,所以我可以使用GraphicalInterface和另一个类可以继承的字段。
答案 0 :(得分:2)
通常,如果您需要等待代码从用户收集信息时应该使用模态对话框,它允许您从用户收集少量信息,同时阻止代码执行对话框变为可见的点,直到它被关闭。
请查看How to Make Dialogs了解详情
您需要设计一个解决方案,允许您的代码从其他表单中获取信息,同时确定用户何时取消或关闭窗口。
一般来说,您不应该从JFrame
或JDialog
这样的顶级容器进行扩展,而是将您的UI表单基于JPanel
这样的方式,这样就可以添加它们到你想要的容器。