2015-09-20 68 views
0

我正在玩MVC模式,我卡住了。在actionPerformed方法中使用控制器 - 需要是最終的?

我的簡單的應用程序(你可以擲骰子)有一個MainView類,它可以創建並保存一些其他視圖,如ButtonPanelView(它有按鈕..)。 MainView由我的MainController創建。 MainController也有我的rollDice方法,它將調用diceModel類並更改值。

現在,我的rollDice Button在ButtonPanelView中,而ActionListener也在這裏。我試圖從actionPerformed方法中調用controller.rollDice(),但錯誤說「變量mainController是從內部類訪問的,需要聲明爲final」。 我不知道該怎麼做,因爲我的this.mainController不能是最終的,因爲它在構造函數中。這裏是我的代碼:

public class ButtonPanelView extends JPanel{ 

    private MainController mainController; 
    private JButton rollDiceBtn = new JButton("roll dice"); 
    private JPanel pan = new JPanel(); 

    public ButtonPanelView(MainController mainController){ 
     this.mainController = mainController; 
     add(pan); 
     pan.add(rollDiceBtn); 

     rollDiceBtn.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent actionEvent) { 
       mainController.rollDice(); 
      } 
     }); 
    } 
} 

感謝您的幫助:)

+0

你爲什麼要將你的控制器添加到你的視圖?這應該是另一回合呢? – user3437460

+0

因爲我認爲actionPerformed方法應該總是在視圖中,按鈕所在的位置。我需要一種方法來從actionPerformed方法訪問控制器中的rollDice方法。另外:如果我有例如一個JTextArea和用戶改變文本(例如通過寫他們的名字),我需要在視圖中的控制器採取數據(在這種情況下,用戶名),並將其提供給模型。 我不需要在視圖中的控制器? – mcCat

+0

如果你這樣做,你打敗了MVC的目的是解耦你的代碼。如果你想分離出視圖(UI)和邏輯,你不需要在視圖中編寫邏輯。您代之以在控制器中編寫邏輯。 – user3437460

回答

0

您可以通過使用OuterClass.this符號爲您在構造函數中創建匿名ActionListener類中引用mainController解決的編譯錯誤:

rollDiceBtn.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent actionEvent) { 
      ButtonPanelView.this.mainController.rollDice(); 
     } 
    }); 
+0

非常感謝! – mcCat

+0

所以我現在的另一個問題是,如果控制器在視圖中可以嗎? 另一個答案在這裏1分鐘前另一種方法,在視圖中我根本不需要控制器。似乎它已被刪除。我也喜歡這種方法,也許發佈它的人可以再次發佈它? – mcCat

+0

請發佈另一個關注設計問題的問題(每個帖子應該只有一個問題)。 –

相關問題