Làm thế nào để nắm bắt sự kiện nhấp vào nút đóng của JFrame?


86

Tôi muốn gọi một phương thức confirmExit()khi nhấp vào nút đóng màu đỏ trên thanh tiêu đề của JFrame.

Làm thế nào tôi có thể nắm bắt sự kiện đó?

Tôi cũng muốn ngăn cửa sổ đóng nếu người dùng chọn không tiếp tục.

Câu trả lời:


147
import javax.swing.JOptionPane;
import javax.swing.JFrame;

/*Some piece of code*/
frame.addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
        if (JOptionPane.showConfirmDialog(frame, 
            "Are you sure you want to close this window?", "Close Window?", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){
            System.exit(0);
        }
    }
});

Nếu bạn cũng muốn ngăn cửa sổ đóng trừ khi người dùng chọn 'Có', bạn có thể thêm:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

25

Ghi đè phương pháp đóng cửa sổ.

public void windowClosing(WindowEvent e)

Nó được gọi khi một cửa sổ đang trong quá trình đóng. Thao tác đóng có thể bị ghi đè tại thời điểm này.


3
Điều này sẽ hoạt động nếu người dùng đóng ứng dụng (ví dụ: bằng cách nhấn Cmd + Q trên máy Mac)? Lớp thực thi phương thức này có phải khai báo implements WindowListenerđể đoạn mã này hoạt động không? Nếu vậy, có thể tốt nếu đưa điều đó vào câu trả lời. Nếu không thì đây là một giải pháp thanh lịch.
kẻ xâm nhập vào

@brandaemon Nếu bạn thêm dòng mã này vào đầu phương thức main () "System.setProperty (" apple.eawt.quitStrategy "," CLOSE_ALL_WINDOWS ");" thì nó sẽ gọi windowListener khi nhấn Cmd + Q trên mac.
retrovius

2
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

cũng hoạt động. Đầu tiên, hãy tạo một khung được gọi là JFrame, sau đó thêm mã này vào bên dưới.


9
Nhưng điều này không thực thi confirmExit()phương thức như OP mong muốn
hage

Tuy nhiên, nó cũng làm điều tương tự
Russell

11
Không, tôi không muốn đóng chương trình một cách đơn giản. Tôi muốn làm điều gì đó trước khi nó xảy ra.
alxcyl

ồ xin lỗi, tôi không biết điều đó.
Russell

1
"Những gì tôi muốn làm là gọi ... confirmExit()khi [dấu X] được nhấp." Và bình luận trước đó không liên quan đến OQ.
DSlomer64

1

Điều này có thể hoạt động:

jdialog.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
        System.out.println("jdialog window closed event received");
    }

    public void windowClosing(WindowEvent e) {
        System.out.println("jdialog window closing event received");
    }
});

Nguồn: https://alvinalexander.com/java/jdialog-close-closing-event


1

Đây là những gì tôi đặt làm tùy chọn menu, nơi tôi đã tạo một nút trên một JFrameđể hiển thị một tùy chọn khác JFrame. Tôi chỉ muốn khung hình mới hiển thị, và không phá hủy khung hình đằng sau nó. Ban đầu tôi ẩn cái đầu tiên JFrame, trong khi cái mới hiện ra. Sau khi đóng cái mới JFrame, tôi loại bỏ nó, sau đó là hành động làm cho cái cũ hiển thị trở lại.

Lưu ý: Đoạn mã sau mở rộng câu trả lời của Ravinda và ngJButton:

ng.addActionListener((ActionEvent e) -> {
    setVisible(false);
    JFrame j = new JFrame("NAME");
    j.setVisible(true);
    j.addWindowListener(new java.awt.event.WindowAdapter() {
        @Override
        public void windowClosing(java.awt.event.WindowEvent windowEvent) {
            setVisible(true);
        }
    });
});

-2

Thử đi:

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Nó sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.