2012-10-08 28 views
5

Tôi đang cố gắng viết một ví dụ Java thực sự đơn giản để tìm hiểu MVC. Đó là một JButton khi nhấn tăng số lượt truy cập và hiển thị số lần nhấp cho đến thời điểm này.Java Click Counter sử dụng MVC

I bùng nổ Model, View và Controller vào các lớp riêng biệt, và nghĩ rằng tôi đang trên con đường đúng đắn, nhưng khi tôi nhấp vào nút JLabel hiển thị bộ đếm tiếp tục ở lại 0.

Có thể ai đó hãy xem nhanh và xem tại sao JLabel hiển thị số lượng nhấp chuột luôn ở mức 0?

Cảm ơn

View 

package mvc; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 


public class View extends javax.swing.JFrame { 
    private JButton jButton1; 
    private JLabel jLabel1; 
    private Controller c; 
    private Model m; 

    /** 
    * Auto-generated main method to display this JFrame 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       Controller c = new Controller();  

       Model m = new Model(); 

       View inst = new View(c,m); 
       inst.setLocationRelativeTo(null); 
       inst.setVisible(true); 
      } 
     }); 
    } 

    public View(Controller c, Model m) { 
     super(); 
     this.c = c;  
     this.m = m; 
     initGUI(); 
    } 

    private void initGUI() { 
     try { 
      setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
      getContentPane().setLayout(null); 
      { 
       jButton1 = new JButton(); 
       getContentPane().add(jButton1, "Center"); 
       jButton1.setText("Click"); 
       jButton1.setBounds(314, 180, 101, 34); 
       jButton1.addActionListener(c); 
      } 
      { 
       jLabel1 = new JLabel(); 
       getContentPane().add(getJLabel1()); 
       jLabel1.setText("Click Count = " + c.getClickCount()); 
       jLabel1.setBounds(439, 183, 91, 27); 

      } 
      pack(); 
      this.setSize(818, 414); 
     } catch (Exception e) { 
      //add your error handling code here 
      e.printStackTrace(); 
     } 
    } 

    public JLabel getJLabel1() { 
     return jLabel1; 
    } 
} 

End View 

Controller class 

package mvc; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Controller implements ActionListener 
{ 
    Model m; 
    View v; 

    public Controller() 
    { 
     m = new Model();   
     v = new View(this, m); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) 
    { 
     if (arg0.getSource() == "Click") 
     { 
      m.addClick(); 
      v.getJLabel1().setText("Click count = " + getClickCount()); 
     } 

    } 

    public int getClickCount() 
    { 
     return m.getClicks(); 
    } 
} 

End Controller class 

Model class 

package mvc; 

public class Model 
{ 
    private int clicks; 

    public Model() 
    { 
     clicks = 0; 
    } 

    public void addClick() 
    { 
     clicks++; 
    } 

    public int getClicks() 
    { 
     return clicks; 
    } 
} 

End Model class 

Trả lời

0

Có vài vấn đề:

  • Các dữ liệu thực tế nên rằng quan điểm hiển thị thường xuất phát từ mô hình chứ không phải từ bộ điều khiển.

    Vì vậy, mã của bạn trong giao diện
    jLabel1.setText("Click Count = " + c.getClickCount());
    nên thay đổi để
    jLabel1.setText("Click Count = " + m.getClickCount());

  • Bên trong Controller, bạn tạo một đối tượng mới của chế độ xem và bên trong phương thức main(), bạn một lần nữa tạo thể hiện mới của bộ điều khiển và chế độ xem. Về cơ bản, lớp Controller đang làm việc trên một khung nhìn và các đối tượng mô hình khác nhau.

Nói chung, nhưng nó không phải là một tiêu chuẩn đá graved:

  • The View có một mô hình, nó doesent tham khảo với bộ điều khiển
  • Mô hình này là độc lập và doesent tham khảo để xem hoặc bộ điều khiển
  • Bộ điều khiển có cả chế độ xem và kiểu máy.
+0

Hi there, tôi r Emoved the Model từ phương thức main() và hàm tạo View giờ đây chỉ lấy một Controller làm tham số. – user1729409

+0

Thông thường, Chế độ xem có mô hình. Các mô hình doesent mất bất cứ điều gì. Bộ điều khiển lấy cả mô hình và chế độ xem. Vì vậy, mô hình doesent biết về View và Controller. View chỉ biết và sử dụng Model, không phải là Controller. Bộ điều khiển có thể tham khảo cả hai Model và View –

0
if (arg0.getSource() == "Click") 

== không có nghĩa là cho chuỗi (hoặc đối tượng) so sánh bình đẳng. Phương pháp equals là những gì bạn nên sử dụng thay thế.

Hơn nữa, tôi nghĩ bạn quan tâm đến phương pháp public String getActionCommand() thay vì public Object getSource().

Một thử nghiệm nhỏ

JButton btn = new JButton(); 
btn.setText("Click");  
btn.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(e.getSource()); 
     System.out.println(e.getActionCommand()); 
    } 
}); 
btn.doClick(); 

và đầu ra

 
javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,bo[email protected]1f5b0afd,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Click,defaultCapable=true] 
Click 

nên minh họa tại sao.

Cập nhật

Hãy thử

if (arg0.getActionCommand().equals("Click")) 
+0

Xin chào, tôi không biết cách cập nhật mã của mình, nhưng tôi đã xóa phần "if (arg0.getSource() ==" Click ")" vì tôi chỉ có nút 1. Dường như vẫn không cập nhật bộ đếm lần nhấp của tôi. – user1729409

+0

@ user1729409: Đã cập nhật câu trả lời của tôi. Bạn có thể thử không? –

+0

Xin chào, yup đã thử điều đó và nó vẫn không hoạt động. – user1729409

0

tôi thấy tại sao bây giờ. Bạn đã tạo hai đối tượng Mô hình khác nhau. Một trong bộ điều khiển và một trong Main() - Cái nào là nó?

Một lời khuyên khác .. tạo một lớp MainController. Điều này sẽ có phương pháp chính của bạn. Phương pháp chính của bạn tạo một Trình điều khiển khác chịu trách nhiệm tạo Chế độ xem và Mô hình của bạn. Sử dụng Bộ điều khiển này làm cầu nối.

+0

Vì vậy, tôi đã kết thúc việc này để làm việc. Bây giờ tôi có các biến View với các biến mẫu cho Model và Controller. Bộ điều khiển lấy một Model và View làm các đối số cho hàm tạo của nó. Mô hình không biết gì về Bộ điều khiển hoặc Chế độ xem. Tôi tạo ra một lớp MainController để tạo và chạy lớp View. Cảm ơn tất cả những người đã giúp !! – user1729409

0

Số luôn luôn bằng 0 vì bạn đang cập nhật trường hợp sai của View. Trong lớp Controller bạn tạo một thể hiện khác không được hiển thị.

v = new View(this, m); 

Bạn thay vì có thể vượt qua trong trường hợp chính của bạn bằng cách thêm một setter:

class Controller implements ActionListener { 
    Model m; 
    View v; 

    public Controller() { 
     m = new Model(); 
    } 

    public void setView(View v) { 
     this.v = v; 
    } 
    ... 

ActionEvent.getSource() trả về một tham chiếu thành phần nhưng jButton1 là không hiển thị công khai. Để khắc phục bạn có thể thêm một getter cho nút hoặc sử dụng lệnh hành động:

if (arg0.getActionCommand().equals("Click")) { 
0

bạn có thể có thể cố gắng làm cho accessor để nút của bạn trên lớp view:

công cộng JButton getButton() {

return jbutton1;

}

public void setButton (nút JButton) {

this.jbutton1 = nút;

}

và trong ứng dụng điều khiển lớp truy nhập của bạn để nút của bạn như thế này:

if (arg0.getSource() == v.getButton()) {

...

}

tôi luôn luôn làm như vậy và tôi không bao giờ có bất kỳ lỗi ...

Các vấn đề liên quan