2010-03-02 45 views
16

Tôi đã thực hiện một ứng dụng và tôi cần phải tiết kiệm một số tùy chọn trước khi thoát (. Cái gì đó như chiều hướng cửa sổ, ..., mà sẽ được ghi trong một tập tin)Cách lưu các tùy chọn ứng dụng trước khi thoát? .

Khung chính đã thiết lập này:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Làm cách nào để lưu các tùy chọn mà tôi quan tâm? (Trước khi thoát khỏi khóa học)

Cảm ơn!

Trả lời

28

Nếu bạn chỉ muốn làm điều gì đó khi ứng dụng đang tắt, bạn có thể kéo tắt máy bằng cách sử dụng t mã của anh ấy:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

     public void run() { 
      // Do what you want when the application is stopping 
     } 
    })); 

Tuy nhiên, điều này sẽ không cho phép bạn không đóng cửa sổ. Nếu bạn cần phải kiểm tra một cái gì đó trước khi thực sự rời khỏi, bạn có thể ghi đè lên các sự kiện windowClosing:

addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     // Do what you want when the window is closing. 
    } 
}); 

Lưu ý rằng giải pháp đầu tiên - bằng cách sử dụng móc shutdown - có ưu điểm là nó không liên quan đến một sự kiện cửa sổ, và sẽ được thực hiện ngay cả khi ứng dụng bị dừng bởi một sự kiện khác (ngoại trừ, tất nhiên, nếu quá trình Java bị giết tàn nhẫn).

+0

Khi tôi sử dụng hàm tạo Thread(), một tệp đã được lưu trong phương thức Thread.run() bị hỏng. Nhưng khi tôi sử dụng các nhà xây dựng Thread (Runnable) như được đề xuất trong ví dụ này tập tin đã được lưu đúng cách. Tôi may mắn hay có vấn đề về loại nhà xây dựng? – ka3ak

+0

Điều này cũng rất hữu ích trong việc xử lý các applet. Khi bỏ chúng, void stop() không phải lúc nào cũng được gọi trong khi phương thức này là. Cảm ơn! : D – Daan

+0

Trừ khi bạn đang sử dụng IDE chế biến và thoát khỏi bản phác thảo qua nút 'dừng', trong trường hợp này thậm chí phương pháp này dường như không hoạt động. – rednoyz

1

Bạn có thể đăng ký WindowListener và lưu tùy chọn của mình trong cửa sổClose method.

Và tất nhiên

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
4

Có thể sau đây sẽ giúp đỡ.

  1. Trước tiên, bạn cần đọc tệp thuộc tính của mình. See doc

    Properties properties = new Properties(); 
    try { 
        properties.load(new FileInputStream("filename.properties")); 
    } catch (IOException e) { 
        System.err.println("Ooops!"); 
    } 
    
  2. Second thêm xử lý sự kiện cho cửa sổ của bạn, mà sẽ lưu dữ liệu của bạn trong file.All tài sản mà bạn cần phải lưu chỉ cần đặt trong thuộc tính dụ và lưu trữ nó trên lối

    addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent e) { 
        try { 
        properties.store(new FileOutputStream("filename.properties"), null); 
        } catch (IOException e) { 
        } 
        } 
    }); 
    

Đó là tất cả, nếu tôi đã hiểu bạn chính xác)

+11

Vui lòng ** không bao giờ ** có khối catch trống, thậm chí không có trong mã mẫu. Đặt ít nhất một 'e.printStackTrace()' vào đó. Mã ví dụ có xu hướng khó chịu để trở thành mã sản xuất và tất cả chúng ta phải duy trì điều đó sau này. –

+0

Trên thực tế đây không phải của tôi), chỉ cần sao chép nhanh/quá khứ. Nhưng bạn hoàn toàn đúng. – ponkin

0

Không chắc chắn điều này áp dụng cho trường hợp của bạn, nhưng nó có thể cho những người khác lướt qua chủ đề này. Ứng dụng của tôi có một() chính và cuối cùng có vòng lặp while (! Shell.isDisposed). Khi ứng dụng chạy vòng lặp đó đang diễn ra và khi ứng dụng được đóng, vòng lặp đó kết thúc và nó sẽ giảm xuống sau khi ứng dụng nằm trong phương thức chính. Đây là nơi tôi đặt một kiểm tra nếu trình chỉnh sửa bị bẩn và nếu các tùy chọn đã thay đổi và xử lý những điều kiện đó. Phương pháp của tôi gắn vào tập tin đóng lại vỏ và gọi phương thức closeCurrent() nhưng nếu ai đó nhấp vào biểu tượng cửa sổ gần 'x' nó rơi xuống đây và tôi kiểm tra lại nếu có bất cứ điều gì bẩn và lưu nếu tôi cần.

while (!shlCpbtool.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    // exit 
    if(dirty){ 
     closeCurrent(); 
    } 
Các vấn đề liên quan