我正在嘗試使用MVC編碼實踐來生成桌面RPG的字符。我將有幾個「控制面板」類,每個類都有一組特定的按鈕來處理角色創建過程的不同方面(滾動屬性,購買設備等)。我的控制器類將擁有每個「控制面板」類的實例。我的廣義代碼是在這裏:如果B類的實例是類A的成員,那麼當B類中的按鈕被按下時,B類如何調用類A的方法?
公共類控制器{
private Model m; //class Model not shown
private Viewer v; //class Viewer not shown
private JFrame frame;
private ControlPanelOne cpo;
private ControlPanelTwo cpt; //class ControlPanelTwo not shown
public Controller(){
m = new Model();
v = new Viewer();
frame = new JFrame();
frame.setLayout(…);
cpo = new ControlPanelOne();
cpt = new ControlPanelTwo();
frame.add(cpo.getPanel());
frame.add(cpt.getPanel());}
public void update(){
m.update();
v.update();}}
公共類ControlPanelOne {
private JPanel panel;
private JButton button;
public ControlPanelOne(){
panel = new JPanel();
button = new JButton(「press me」);
panel.add(button);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//do some stuff;
//call Controller’s update method;}})} //the important bit!
public JPanel getPanel(){
return panel;}}
公共類測試儀{
public static void main(String[] args){
Controller c = new Controller();}}
我怎樣才能得到ControlPanelOne看並在按下ControlPanelOne的按鈕時調用Controller的update()方法?我試着製作ControlPanelOne擴展控制器,這樣我就可以在按下ControlPanelOne的按鈕時調用super.update(),但當Controller實例化時(例如在Tester類中),它的ControlPanelOne成員也會被實例化, Controller和ControlPanelOne的構造函數在構造的無限循環中調用。
試圖欺騙編譯器,使Controller的update()方法靜態不起作用,因爲實例m和v不是靜態的。
我不想讓ControlPanelOne成爲控制器的內部類,如果我可以幫助它的話。還會有其他的「控制面板」類(ControlPanelTwo等),我害怕讓所有的內部類都會讓Controller的代碼變得漫長而混亂。我希望每個「控制面板」作爲一個單獨的類來處理一個特定的功能,以便於維護和模塊化代碼重用。
似乎很清楚,ControlPanelOne不應該有一個控制器作爲成員變量,因爲)它是概念上向後和b)其他的「控制面板」的需要自己一個控制器的情況下,情況......
我曾經有過控制器擴展JFrame和ControlPanelOne擴展JPanel(這樣Controller可以直接添加()一個ContollPanelOne的實例,而不是調用ControlPanelOne的getPanel()方法),但是我讀了讓類擴展這些組件,而不是讓你的組件成員上課形式很差。但是,如果它會以某種方式幫助回去使控制器和擴展ControlPanelOne JFrame的JPanel的和...
也許我的MVC的想法是錯誤的...
請告知
您應該使用接口來定義像'update'這樣的常用方法,並將該接口作爲參數傳遞給控制面板 –
如果您希望特定的A類實例能夠調用B類的特定實例上的實例方法那麼爲什麼不簡單地將對B實例的引用傳遞給A的構造函數呢? – scottb