2013-02-05 40 views
9

Tôi bị ướt chân với javafx. Đây là những gì tôi đang làm.Bộ điều khiển mỏng

FXML Views 
DI Controllers 
Weld-SE Managed Services and Models 
Trying to confine UI to FXML 
Trying keep the Controllers thin 

Vấn đề:

Trong khi cố gắng để mã giao diện người dùng, giao diện người dùng tĩnh nhất là giới hạn bên trong fxml. Nhưng có những tình huống mà tôi thấy mình tự thêm, xóa, hiển thị, ẩn các phần tử, v.v.

Tôi tự làm điều này bên trong bộ điều khiển vì fx cho phép tôi cấu hình phương thức điều khiển trong giao diện mà nó sẽ gọi trên một hành động cụ thể biến cố. Tất cả các mã này đề cập đến việc xây dựng/thao tác UI động và nằm trong lớp xem. Nhưng, nó kết thúc trong bộ điều khiển làm cho bộ điều khiển chất béo.

javafx cung cấp tích hợp javascript. Đây là một cách có thể để trừu tượng mã xem manupulation đó. Nhưng điều này sẽ thêm javascript không hoàn hảo như vậy vào hỗn hợp.

Làm cách nào để tôi trừu tượng mã trong java hoặc fxml để tôi không phá vỡ Mô hình Bộ điều khiển Mỏng?

EDIT

@assylias

Đồng ý, tôi đã nghĩ về điều này và cách này mà lớp java và fxml cùng nhau trở thành một widget thể tái sử dụng. Nhưng sau đó, làm thế nào để tôi dây này vào FXML. FXML không hiểu gì ngoài bộ điều khiển. Hãy nói rằng tôi dây lớp này xem vào fxml bằng cách sử dụng fx: điều khiển và không tên nó điều khiển. Vì vậy, tôi có một cái gì đó như thế này.

enter image description here

Quan điểm này lớp không có gì nhưng mã xem thao tác. Sau đó, tôi sẽ tạo một lớp điều khiển khác. Nhưng sau đó tôi mong đợi bằng cách nào đó sẽ điền dữ liệu biểu mẫu vào bộ điều khiển này. Điều này chỉ xảy ra khi người dùng đã gửi biểu mẫu. Vì vậy, trong một cách, tôi cần phải nói với javafx bằng cách nào đó mà yêu cầu thao tác UI/sự kiện khác với yêu cầu/sự kiện thao tác dữ liệu thực tế.

Suy nghĩ của bạn, xin lỗi nếu nó dài dòng. Đã cố gắng để nói nó trong vài từ như tôi có thể.

+1

Bạn có thể có chế độ xem FXML, Chế độ xem Java (lớp điều khiển đầu tiên) thực hiện công cụ động và sau đó là Bộ điều khiển Java thích hợp, mở rộng đầu tiên. (không chắc chắn rằng sẽ làm việc, chỉ là một ý tưởng). – assylias

+1

Bạn dường như cố gắng áp dụng mẫu MVC, nhưng nó không cần thiết cho hầu hết các kịch bản. Bộ điều khiển trong Java FX không phải là bộ điều khiển của mẫu MVC như bạn đã tìm ra (Xem Lớp trong sơ đồ của bạn). Vậy bạn muốn giải quyết vấn đề gì? Bạn có thể cung cấp mẫu không? – Puce

+0

Tôi đã hy vọng tìm hiểu làm thế nào để tổ chức tốt hơn mã của tôi và tránh lộn xộn mã. Tôi nghĩ những người khác hẳn đã gặp vấn đề này trước tôi và phải tìm ra cách giải quyết. – ShaggyInjun

Trả lời

0

Làm cách nào để đặt mã thao tác chế độ xem của bạn trong Lớp chính?

lớp chính:

public class SampleJavaFXApp extends Application{ 

public static void main(String[] args) { 
    launch(args); 
} 
@Override 
public void start(Stage primaryStage) throws IOException { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource(
      "SampleUI.fxml")); 
    Parent root = (Parent) loader.load(); 
    Controller controller = loader.getController(); 
    viewManipulationLogic(controller); 
    primaryStage.setScene(new Scene(root)); 
    primaryStage.show();  
} 
     // view manipulation logic 
private void viewManipulationLogic(Controller controller) { 
controller.getBlueButton().setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent arg0) { 
      System.out.println(" I am just about button!"); 
     } 
    }); 
} 

Bộ điều khiển:

public class Controller implements Initializable { 
    @FXML 
    private Button blueButton; 
    public Button getBlueButton() { 
     return blueButton; 
    } 
@Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     //real data manipulation 
} 
} 

khuyết điểm: Bạn cần thu khí cho tất cả các nút u muốn thao tác, trong lớp điều khiển.

+0

Tôi nghĩ rằng nó là ra khỏi vị trí ngay cả trong MainClass, nhưng nó sẽ làm việc cho các ứng dụng đơn giản với một lần xem có thể được. Nhưng nếu bạn có nhiều hơn một tập tin FXML, điều này được ra khỏi bàn tay và lộn xộn lên nhanh chóng. – ShaggyInjun

1

Tôi nghĩ giải pháp đơn giản nhất là nhớ rằng bộ điều khiển được chỉ định trong FXML là bộ điều khiển xem. Mục đích của nó là chứa mã để sửa đổi và cập nhật khung nhìn, không chứa mã điều khiển MVC truyền thống hoặc logic nghiệp vụ.

Ví dụ: trong dự án tôi hiện đang làm việc, tôi đang sử dụng JavaFX với Akka Actors. Ứng dụng này được viết bằng scala. Bộ điều khiển xem JavaFX chứa bất kỳ mã nào cần thiết để sửa đổi chế độ xem. Một màn hình chứa biểu mẫu đăng nhập.Khi người dùng nhấp vào nút đăng nhập, trình điều khiển chế độ xem chỉ cần tạo một thông báo chứa tên người dùng và mật khẩu và gửi thông báo đó đến tác nhân chịu trách nhiệm thực hiện logic nghiệp vụ. Nếu diễn viên đó xác định có một lỗi thì nó sẽ gửi một thông điệp trở lại bộ điều khiển xem và bộ điều khiển xem có thể quyết định loại cập nhật nào cần được thực hiện trên màn hình.

Tôi nhận thấy rằng việc sử dụng diễn viên akka với JavaFX đơn giản hóa việc mã hóa ứng dụng vì ít nhất hai lý do.

  1. Vì sử dụng hệ thống tác nhân ủy nhiệm gửi thư giữa các diễn viên, có ranh giới tự nhiên giữa mã trình bày và mã doanh nghiệp. Các thông điệp được truyền qua lại tạo thành ranh giới tự nhiên này.
  2. Sử dụng diễn viên thay thế hoàn toàn sự phức tạp khi làm việc với chủ đề/nhiệm vụ. Nó hoàn toàn loại bỏ sự cần thiết phải mã số javafx.concurrent.Task cho các quy trình chạy dài.
Các vấn đề liên quan