2009-03-20 66 views
5

Làm thế nào tôi có thể nhận được kết quả từ một quy trình CMD để hiển thị trong GUI của tôi? Đây là mã tôi đang sử dụng để chạy quá trình:Hiển thị đầu ra CMD trong GUI (java)

try { 
    String line; 
    Process p = Runtime.getRuntime().exec("cmd /c \"e:\\folder\\someCommands.cmd\""); 
    BufferedReader input = 
      new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
     System.out.println(line); 
    } 
    input.close(); 
} catch (Exception err) { 
    err.printStackTrace(); 
} 

Tôi đã cố gắng làm điều này:

jLabel1.setText(line); 

... nhưng GUI là hoàn toàn bị nhốt trong khi quá trình đang chạy, vì vậy không có gì cập nhật cho đến khi kết thúc, mà không phải là rất hữu ích. Khác hơn là CMD hoạt động tốt. Tôi chỉ muốn hiển thị đầu ra trong thời gian thực.

+0

Có lý do nào bạn muốn sử dụng JLabel thay vì và JTextArea không? – OscarRyz

+0

Đề xuất xóa thẻ thời gian thực khỏi câu hỏi này. Xem http://en.wikipedia.org/wiki/Real-time để biết định nghĩa về tính toán thời gian thực – andersoj

+0

Câu trả lời này từ ["Monkey Phần mềm"] (http://stackoverflow.com/users/8946/software-monkey) nên làm: OscarRyz

Trả lời

5

Bạn có sơn lại() sau khi đặt văn bản của nhãn không?

Dù sao, bạn thường nên do dự khi thực thi thao tác dài trên chuỗi sự kiện GUI. Thay vào đó, hãy sử dụng một số SwingWorker.

3

Bạn sẽ cần bắt đầu một chuỗi riêng biệt để chạy quy trình. Mã bạn đang sử dụng để chạy nó có thể chủ yếu chỉ được chèn vào của chủ đề (hoặc Runnable 's) run() phương pháp như là, nhưng để thiết lập các văn bản trong JLabel, bạn nên sử dụng một cái gì đó như thế này:

... 
while ((line = input.readLine()) != null) { 
    SwingUtilities.invokeLater(new SetTextRunnable(jLabel1, line)); 
} 
... 

class SetTextRunnable implements Runnable { 
    private String line; 
    private JLabel jLabel1 
    public SetTextRunnable(JLabel jLabel1, String line) { 
     this.jLabel1 = jLabel1; 
     this.line = line; 
    } 
    public void run() { 
     jLabel1.setText(line); 
    } 
} 

EDIT: chỉ cần chú ý một điều gì đó: dường như lớp SwingWorker được thiết kế cho loại điều này, vì vậy đó là một tùy chọn khác cho bạn (nếu nó tồn tại trong phiên bản Java của bạn).

CHỈNH SỬA cho EDIT: rất ngớ ngẩn cho tôi, tôi không nhận thấy SwingWorker đã được đề cập trong câu trả lời khác.

+0

hoặc chỉ cần đặt mã để đọc quy trình 'phát trực tuyến thành một chuỗi riêng biệt. Ví dụ: bạn có thể muốn một luồng khác đọc luồng lỗi. – dotjoe

2

Ngoài những gì người khác đã nói về đa luồng này - bạn cũng sẽ muốn đọc luồng lỗi quy trình con. Tôi tin rằng (trong một số trường hợp) nếu bạn không làm cạn kiệt luồng lỗi cho quá trình, nó có thể khiến nó bị treo.

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