Tôi có một ứng dụng có lớp trừu tượng mở rộng JDialog
. Các lớp như một abstract void onClose()
, và trong constructor của lớp, các mã sau đây được thêm vào:`WindowListener` hoạt động, bắn vĩnh viễn
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
onClose();
}
}
Sự kiện này được kích hoạt khi mong đợi, nhưng sau đó một điều kỳ lạ xảy ra. Khi phần mở rộng cụ thể của lớp này có mã để tạo mới JDialog
theo phương pháp onClose()
vàcủa defaultCloseOperation
là JDialog.DISPOSE_ON_CLOSE
, sự kiện này được kích hoạt liên tục, cho đến khi tôi buộc phải ngừng hoạt động.
Chúng tôi đã tách mã để các SSCCE sau:
// package removed
// imports removed
public class SSCCE extends JDialog {
public static void main(String[] args) {
SSCCE s = new SSCCE();
s.pack();
s.setVisible(true);
}
public SSCCE() {
setLayout(new GridLayout(1, 0, 0, 0));
JButton btn = new JButton("click me");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
dispose();
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.out
.println("SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()");
onClose();
}
});
add(btn);
}
public void onClose() {
JDialog dialog = new JDialog();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
}
}
Khi nhấp vào nút "nhấp tôi", sự xuất hiện JDialog
trống và SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
xuất hiện trong cửa sổ giao diện điều khiển. Khi tôi đóng hộp thoại trống, nó xuất hiện lại và văn bản xuất hiện trở lại.
Một điều thực sự thú vị là khi tôi thay đổi dòng khởi tạo từ
JDialog dialog = new JDialog();
để
JDialog dialog = new JDialog() {
@Override
public synchronized void addWindowListener(WindowListener l) {
super.addWindowListener(l);
System.out
.println("SSCCE.onClose().new JDialog() {...}.addWindowListener()");
}
};
tôi nhận được đầu ra sau trong giao diện điều khiển:
Khi nhấp "nhấp chuột tôi "button:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
Tại đóng cửa đầu tiên của hộp thoại:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
Tại đóng cửa thứ hai của hộp thoại:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
Mỗi lần tôi đóng hộp thoại, addWindowListener(WindowListener l)
được gọi là thời gian thêm, mặc dù tôi không cố ý gọi nó.
Tôi không thực sự muốn bất kỳWindowListener
s được đăng ký trên hộp thoại, nhưng tôi nghĩ rằng chỉ đơn giản là trọng phương pháp addWindowListener(...)
và không gọi super.addWindowListener(...)
sẽ là quá cẩu thả.
Tôi đang chạy Java 1.6.0_31 trên Mac OS X 10.6.8, sử dụng Eclipse Indigo (với WindowBuilder, nếu nó quan trọng).
Có ai có ý tưởng nào không?
Cảm ơn!
Cảm ơn! Điều đó có ý nghĩa hoàn hảo. – wchargin