我正在制作数学游戏应用程序并且最近开始实施MVC。
我有以下结构:
auiAs2
MigJPanel:延伸JPanel
ScreenInterface.java:包含全局变量,字体和难度enum
MathsGame.java:延伸JFrame
auiAs2.view
DiffView.java:扩展MigJPanel
实施ScreenInterface
GameView.java:扩展MigJPanel
实现ScreenInterface
EndGameView.java:扩展MigJPanel
实现ScreenInterface
auiAs2.controller
GameControl.java
EndGameControl.java
auiAs2.model
我的MathsGame.java
包含JPanel
设置为CardLayout
的{{1}},DiffView
和GameView
个实例。当我运行我的程序时,EndGameView
'卡'向用户显示。
如果用户点击"新游戏",diffView
中的ActionListener
会获得所选的难度。
DiffControl.java
这是我被卡住的地方。我应该在public class DiffControl {
private DiffView diffView;
private Model model;
public DiffControl(DiffView diffView, Model model) {
this.diffView = diffView;
this.model = model;
this.diffView.addNewGameListener(new NewGameListener());
}
class NewGameListener implements ActionListener {
String selectedDiff;
@Override
public void actionPerformed(ActionEvent e) {
selectedDiff = diffView.getSelectedDiff();
//MathsGame.setLayCard(panContainer, "New Game"));
}
}
}
CardLayout
JPanel
的哪些面板之间切换? (layCard
如下所示,删除了不相关的代码。如果需要,相关类的完整代码将在上面链接)
MathsGame.java
所以我的问题是:
public class MathsGame extends JFrame {
private JPanel panContainer = new JPanel();
private CardLayout layCard = new CardLayout();
public MathsGame() {
panContainer.setLayout(layCard);
setContentPane(panContainer);
setSize(new Dimension(WIDTH, HEIGHT));
setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
setTitle(TITLE);
DiffView panDiffView = new DiffView();
panContainer.add(panDiffView, "Choose Difficulty");
GameView panGameView = new GameView();
panContainer.add(panGameView, "New Game");
EndGameView panEndGameView = new EndGameView();
panContainer.add(panEndGameView, "End Game");
Model model = new Model();
DiffControl diffControl = new DiffControl(panDiffView, model);
//GameControl gameControl = new GameControl(panGameView, model);
//EndGameControl EndGameControl = new EndGameControl(panEndGameView, model);
layCard.show(panContainer, "Choose Difficulty");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MathsGame::new);
}
}
容器中的视图之间的切换相关的代码放在哪里?答案 0 :(得分:3)
模型将有一个反映视图的状态字段,可能是枚举。您可以使用SwingPropertyChangeSupport对象将其设为绑定属性。然后视图可以监听此属性的状态并根据其状态交换卡。实际上,每个枚举常量的toString()
可用于将卡视图添加到使用CardLayout的容器中。
修改强>
你问:
您能详细说明SwingPropertyChangeSupport的用法吗?
我尝试在模型中使用addPropertyChangeListener。当CardLayout在MathsGame.java中时,View如何控制卡的更改?
视图将被通知模型的状态更改,然后当发生这种情况时,视图会调用其代码来交换卡片。
我在View for"在非静态上下文中调用静态方法时遇到了问题"。
这是一个完全不同的无关问题,一个基本的核心Java问题,我确信只需要一点点工作,你就能够解决。简而言之 - 不要尝试以静态方式调用实例代码。总是在适当的参考上调用它,而不是在课堂上。