如何使用MVC在CardLayout中的JPanel之间切换?
我正在制作数学游戏应用程序,最近开始实施MVC。
我有以下结构:
-
auiAs2
-
MigJPanel :扩展
JPanel
-
ScreenInterface.java :包含全局变量,字体和难度
enum
-
MathsGame.java :扩展
JFrame
-
-
auiAs2.view
-
DiffView.java :扩展
MigJPanel
实现ScreenInterface
-
MigJPanel
:扩展MigJPanel
实现ScreenInterface
-
EndGameView.java:扩展
MigJPanel
实现ScreenInterface
-
-
auiAs2.controller
-
DiffControl.java
-
GameControl.java
-
EndGameControl.java
-
-
auiAs2.model
- Model.java :实现ScreenInterface
我的MathsGame.java
包含一个设置为CardLayout
的JPanel
,其中添加了DiffView
, EndGameView
和EndGameView
实例。 当我运行程序时,会向用户显示diffView
‘卡’。
如果用户单击“新游戏”,则DiffControl.java
的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); } }
所以我的问题是:
- 在我的
CardLayout
容器中放置与视图相关的代码的最佳位置在哪里?
该模型将具有反映视图的状态字段,可能是枚举。 您可以使用SwingPropertyChangeSupport对象将其设为绑定属性。 然后视图可以监听此属性的状态并根据其状态交换卡。 实际上,每个枚举常量的toString()
可用于将卡视图添加到使用CardLayout的容器中。
编辑
你问:
你能详细说明SwingPropertyChangeSupport的用法吗?
您可以在此处找到此示例,尤其是此处 。
我试图在模型中使用addPropertyChangeListener。 当CardLayout在MathsGame.java中时,View如何控制卡的更改?
视图将被通知模型的状态更改,然后当发生这种情况时,视图将调用其代码来交换卡。
我在View中执行“从非静态上下文调用静态方法”时遇到了问题。
这是一个完全不同的无关问题,一个基本的核心Java问题,我相信一点点工作,你将能够解决。 简而言之 – 不要尝试以静态方式调用实例代码。 总是在适当的参考上调用它,而不是在课堂上。