如何使用MVC在CardLayout中的JPanel之间切换?

时间:2014-12-20 22:19:01

标签: java swing design-patterns model-view-controller cardlayout

我正在制作数学游戏应用程序并且最近开始实施MVC。

我有以下结构:

  • auiAs2

  • auiAs2.view

    • DiffView.java扩展MigJPanel实施ScreenInterface

    • GameView.java:扩展MigJPanel实现ScreenInterface

    • EndGameView.java:扩展MigJPanel实现ScreenInterface

  • auiAs2.controller

  • auiAs2.model

我的MathsGame.java包含JPanel设置为CardLayout的{​​{1}},DiffViewGameView个实例。当我运行我的程序时,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); } } 容器中的视图之间的切换相关的代码放在哪里?

1 个答案:

答案 0 :(得分:3)

模型将有一个反映视图的状态字段,可能是枚举。您可以使用SwingPropertyChangeSupport对象将其设为绑定属性。然后视图可以监听此属性的状态并根据其状态交换卡。实际上,每个枚举常量的toString()可用于将卡视图添加到使用CardLayout的容器中。


修改
你问:

  

您能详细说明SwingPropertyChangeSupport的用法吗?

您可以找到此herehere,尤其是here的示例。

  

我尝试在模型中使用addPropertyChangeListener。当CardLayout在MathsGame.java中时,View如何控制卡的更改?

视图将被通知模型的状态更改,然后当发生这种情况时,视图会调用其代码来交换卡片。

  

我在View for"在非静态上下文中调用静态方法时遇到了问题"。

这是一个完全不同的无关问题,一个基本的核心Java问题,我确信只需要一点点工作,你就能够解决。简而言之 - 不要尝试以静态方式调用实例代码。总是在适当的参考上调用它,而不是在课堂上。