如何使用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包含一个设置为CardLayoutJPanel ,其中添加了DiffViewEndGameViewEndGameView实例。 当我运行程序时,会向用户显示diffView ‘卡’。

如果用户单击“新游戏”,则DiffControl.javaActionListener 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问题,我相信一点点工作,你将能够解决。 简而言之 – 不要尝试以静态方式调用实例代码。 总是在适当的参考上调用它,而不是在课堂上。