2009-08-27 47 views
16

Khi chương trình bắt đầu, một JFrame mới sẽ được tạo. Khi người dùng nhấp vào nút bắt đầu, một chuỗi được tạo và bắt đầu. Một phần của việc thực thi luồng này là xác nhận hợp lệ dữ liệu trên biểu mẫu và sau đó thực hiện với dữ liệu đó. Một khi dữ liệu đã được xác nhận, các cuộc gọi thread vứt bỏ() trên khung ban đầu và sau đó tạo ra một JFrame mới hoạt động như một bảng điều khiển.Làm cách nào để tạo một chuỗi chờ JFrame đóng trong Java?

Ngoài ra còn có chế độ tự động của chương trình không hiển thị bất kỳ GUI nào, chế độ này đọc dữ liệu từ tệp cấu hình và sau đó bắt đầu chuỗi thực thi và chạy mọi thứ nhưng không có bảng điều khiển.

Tôi muốn chương trình kết thúc khi chuỗi hoàn tất, nhưng ở chế độ GUI, chỉ khi người dùng đã đóng bảng điều khiển. Có thể tạo chủ đề chờ khung đóng không. Tôi giả sử rằng khung được chạy từ chính Thread của nó? hoặc là không phải vậy.

Cảm ơn.

Trả lời

23

Câu trả lời bạn chọn là một chút khó xử. Sử dụng Thread.sleep (1000) sẽ kiểm tra trạng thái cửa sổ mỗi giây. Nó không phải là một vấn đề hiệu suất, nhưng chỉ là phong cách mã hóa xấu. Và bạn có thể có thời gian phản hồi một giây.

Mã này tốt hơn một chút.

private static Object lock = new Object(); 
private static JFrame frame = new JFrame(); 
/** 
* @param args 
*/ 
public static void main(String[] args) { 

    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    frame.setVisible(true); 

    Thread t = new Thread() { 
     public void run() { 
      synchronized(lock) { 
       while (frame.isVisible()) 
        try { 
         lock.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       System.out.println("Working now"); 
      } 
     } 
    }; 
    t.start(); 

    frame.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent arg0) { 
      synchronized (lock) { 
       frame.setVisible(false); 
       lock.notify(); 
      } 
     } 

    }); 

    t.join(); 
} 
+1

Vâng, tôi có thể thấy lý do tại sao điều đó sẽ tốt hơn. Cảm ơn. –

+0

Tôi nghĩ rằng một t.join() bị thiếu ở cuối –

+0

Có, cảm ơn bạn. –

1

Bạn có thể tham chiếu từ chuỗi của mình đến JFrame. Sau đó, đặt hoạt động đóng mặc định của JFrame thành HIDE_ON_CLOSE. Nếu JFrame bị đóng, bạn có thể dừng chuỗi.

Ví dụ mã:

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class FrameExample extends JFrame { 

    public FrameExample() { 
     setSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(HIDE_ON_CLOSE); 
     setVisible(true); 

    } 

    private static class T implements Runnable { 

     private FrameExample e; 

    public T(FrameExample e) { 
     this.e = e; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      if (e.isVisible()) { 
       // do the validation 
       System.out.println("validation"); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e1) { 
        break; 
       } 
      } 
     } 
    } 

} 

public static void main(String[] args) { 
    FrameExample frameExample = new FrameExample(); 

    new Thread(new T(frameExample)).start(); 
    } 
} 
+0

Cảm ơn đó chỉ là những gì tôi cần. –

2

Tất cả các thành phần Swing, bao gồm JFrame, được quản lý bởi một chủ đề duy nhất, được gọi là Chủ đề tổ chức sự kiện văn, hoặc EDT. (Có thể gọi các phương thức trên đối tượng Swing từ các chủ đề khác, nhưng điều này thường không an toàn, ngoại trừ một vài trường hợp không liên quan ở đây.)

Bạn có thể thực hiện những gì bạn muốn ở đây bằng cách đặt mã xác nhận và thực thi dữ liệu trong chính đối tượng của nó mà hoàn toàn không biết về thế giới bên ngoài. Sau đó, gọi nó từ một trong hai đối tượng khác: một đối tượng quản lý GUI và một đối tượng khác chạy trong "chế độ tự động".

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