2013-02-18 39 views
11

Tôi đang cố gắng thiết lập dịch vụ nền sẽ thực hiện tải hàng loạt dữ liệu giao dịch từ tệp csv. Dịch vụ nền này sẽ được bắt đầu từ một hành động mục menu được ánh xạ tới một phương thức trong lớp điều khiển/người trình bày.JavaFX2: Tôi có thể tạm dừng nền Task/Service không?

Thường xuyên như vậy, một số dữ liệu sẽ xuất hiện trong tệp csv mà không có dữ liệu chủ nào có thể tìm thấy trong cơ sở dữ liệu, điều này thường khiến tải lên bị lỗi và không thành công.

Trong những trường hợp như vậy, tôi muốn có thể có dịch vụ nền tạm dừng quá trình xử lý và gọi hộp thoại từ lớp người trình bày để nhận thông tin nhập của người dùng. Đầu vào của người dùng sẽ được sử dụng để thêm hàng chính trong cơ sở dữ liệu, sau đó dịch vụ nền sẽ tiếp tục từ nơi nó đã dừng lại (không phải từ đầu tệp csv, nhưng từ hàng gây ra lỗi).

Điều này có thể đạt được trong JavaFX, có lẽ với API javafx.concurrent không? Tôi sẽ đi đâu để tới đó?

Trả lời

20

Giải pháp

Khi quá trình nền của bạn gặp một tình huống mà nó đòi hỏi người dùng phải được nhắc nhở cho đầu vào, sử dụng FutureTask thực hiện trong Platform.runLater-showAndWait dấu nhắc hộp thoại trên các chủ đề ứng dụng JavaFX. Trong quá trình nền sử dụng futureTask.get để tạm dừng quá trình nền cho đến khi người dùng nhập các giá trị cần thiết cho phép quá trình tiếp tục.


Sample Code Snippet

Dưới đây là bản chất của mã cho phương pháp này có thể được đặt bên trong gọi phương thức của quá trình nền của bạn:

String nextText = readLineFromSource(); 
if ("MISSING".equals(nextText)) { 
    updateMessage("Prompting for missing text"); 
    FutureTask<String> futureTask = new FutureTask(
    new MissingTextPrompt() 
); 
    Platform.runLater(futureTask); 
    nextText = futureTask.get(); 
} 
... 
class MissingTextPrompt implements Callable<String> { 
    private TextField textField; 

    @Override public String call() throws Exception { 
    final Stage dialog = new Stage(); 
    dialog.setScene(createDialogScene()); 
    dialog.showAndWait(); 
    return textField.getText(); 
    } 
    ... 
} 

Sample Ứng dụng

Tôi đã tạo a small, complete sample application để chứng minh phương pháp này.

Kết quả của việc áp dụng mẫu là:

promptingtaskdemooutput

Sample Output Giải thích

dòng đọc không có giá trị thiếu chỉ là đồng bằng màu nâu. Các dòng có giá trị nhắc được nhập có nền màu xanh nhạt. Mười bốn dòng đã được đọc, tác vụ nền đã tạm dừng một lần ở dòng thứ 6 thiếu một giá trị. Người dùng được nhắc về giá trị còn thiếu (mà người dùng đã nhập xyzzy), sau đó quá trình tiếp tục cho đến khi dòng 14 cũng bị thiếu và nhiệm vụ nền lại bị tạm dừng và một hộp thoại nhắc khác đang được hiển thị.

+1

Tuyệt vời, có vẻ như nó sẽ thực hiện công việc. Cảm ơn. –

+0

Cảm ơn bạn đã dành thời gian để cung cấp một giải pháp; một sửa đổi điều này không xuất hiện để giải quyết vấn đề của tôi. Tuy nhiên tôi thấy một hành vi tò mò nhất trong mã mẫu mà bạn đã cung cấp. Nếu tôi sửa đổi chuỗi đầu vào và đặt mã thông báo đầu tiên thành 'MISSING', chương trình sẽ bị treo; cửa sổ hộp thoại để nhập vào người dùng không bật lên. Nhưng, nếu tôi tiến hành gỡ lỗi nó (trong NetBeans 7.2), nó hoạt động tốt. Bất kỳ ý tưởng gì đang xảy ra ở đây? –

+0

Đã xảy ra lỗi trong mã mẫu. Mẫu sử dụng 'container.getScene(). GetWindow()' trong một tác vụ (chính xác) ném một (chưa được báo cáo) 'NullPointerException' khi vùng chứa chưa được thêm vào một cảnh. Tôi đã thay đổi thứ tự logic trong mẫu để tác vụ không được bắt đầu cho đến khi vùng chứa được sử dụng đã được thêm vào cảnh (để tránh vấn đề này). [Cập nhật mã mẫu được liên kết] (https://gist.github.com/jewelsea/4989970). – jewelsea

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