2009-07-16 72 views
7

Tôi muốn sử dụng MVC để cấu trúc ứng dụng Swing của tôi, nhưng dường như có một xung đột.Kiến trúc MVC và Swing

Khi tôi hiểu MVC, bộ điều khiển sẽ xử lý đầu vào và cập nhật mô hình. Mô hình phải thông báo cho các quan sát viên của mình rằng chế độ xem là một.

Tôi có hai vấn đề

  • Swing là tất cả phần của view. Thực tế là các thành phần có mô hình riêng của họ là một chi tiết thực hiện. Tôi muốn giữ mã swing-cụ thể ra khỏi bộ điều khiển/mô hình phải không?
  • Bộ điều khiển của tôi cần nhận sự kiện do người dùng kích hoạt, nhưng điều này đến từ thành phần xoay trong chế độ xem và bộ điều khiển không nên biết về chế độ xem.

Tôi chắc chắn vấn đề này đã được giải quyết nhiều lần trước đây, nhưng tôi không thể tìm thấy ví dụ thế giới thực về ứng dụng xoay MVC dựa trên kích thước phù hợp.

Update - Một vấn đề tôi quên

gì MVC không phục vụ trực tiếp cho là cấu trúc của các thành phần MVC khác nhau trong hệ thống phân cấp của ứng dụng. Ví dụ: màn hình chính có thể có các tab "bán hàng" và "mua", mỗi tab có thể có các bảng "truy vấn" và "truy vấn" mới. Ngày đầu đó, có thể có một nút "sửa đổi được lựa chọn" mà sẽ tạo ra (có thể nhiều) cửa sổ theo yêu cầu.

Điều gì đó phải tạo mô hình, chế độ xem và bộ điều khiển cho các thành phần phụ này theo yêu cầu. Nó không thể là bộ điều khiển từ bộ điều khiển hay mô hình vì chúng không biết chế độ xem nào tạo ra và nó không phải là khung nhìn vì nó là logic ứng dụng và nó trả lời một sự kiện (đó là công việc của bộ điều khiển).

Có câu trả lời không?

Trả lời

6

Các thành phần xoay như JButton vv là bộ điều khiển. Các lớp xem là JButtonUI, v.v.

Để tách logic xử lý sự kiện khỏi mã "xem" của bạn, điều đơn giản nhất là tiêm một lớp cụ thể Controller vào tất cả các bảng của bạn. Đó là xử lý bằng cách nào, sự kiện chỉ có thể trông giống như:

doStuffButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     controller.doStuff(); // logic in controller 
    } 
}); 

lớp bảng của bạn có thể cung cấp lên Model s để điều khiển của bạn, vì vậy ví dụ:

public void doStuff() { 
    MyData data = ... 
    dataModel.setData(data) 
} 

Bằng cách đó bộ điều khiển là nhận thức của các mô hình, và quan điểm là nhận thức của bộ điều khiển nhưng bộ điều khiển không biết về chế độ xem (triển khai)

+0

a) Chỉ theo như Swing liên quan - tức là ở cấp thành phần. Tôi đang nói về việc sử dụng kiến ​​trúc MVC cho ứng dụng của tôi. b) Trên thực tế swing không phải là đúng MVC - thành phần là bộ điều khiển và xem, và nó sử dụng một UIDelegate. – Draemon

+0

Điều này là đúng nhưng theo như a) là có liên quan, tôi đang bối rối. Bạn hỏi về cấu trúc một ứng dụng Swing –

+0

Tôi chỉ có nghĩa là lớp JButton không có tất cả các logic vẽ (mà tôi sẽ xem là dạng xem) –

0

Trong bộ điều khiển java swing không cần biết các thành phần ui. Bạn thực hiện mã điều khiển trong một ActionListener. Sau đó, ActionListener bị ràng buộc, ví dụ: đến một số JButton. Khi nhấp chuột JButton, nó sẽ gọi số ActionListener. Các ActionListener chỉ phụ thuộc vào các mô hình khác. Nó sử dụng một số mô hình như là đầu vào của nó và những người khác vì nó là kết quả hoặc đầu ra. Nó giống như đối số phương thức và giá trị trả về. Các mô hình thông báo cho ui khi chúng được cập nhật. Vì vậy, không cần logic điều khiển để biết thành phần ui.Ngay cả các đối tượng mô hình không biết ui thông báo được thực hiện bởi một mô hình quan sát viên. Vì vậy, các đối tượng mô hình chỉ biết rằng có ai đó muốn được thông báo nếu mô hình thay đổi.

Hãy xem ví dụ sau đây được lấy từ https://www.link-intersystems.com/bin/view/Blog/The+MVC+pattern+implemented+with+java+swing

Đây là cách tôi phiên dịch mô hình MVC trong java swing.

  • Đỏ = mô hình
  • Xanh = view
  • xanh = điều khiển

enter image description here

Trong java swing có một số thành phần mà thực hiện một mô hình và bộ điều khiển là tốt. Ví dụ. số javax.swing.Action. Nó thực hiện một mô hình ui (thuộc tính: enablement, biểu tượng nhỏ, tên, vv) và là một bộ điều khiển bởi vì nó mở rộng ActionListener.