मेरे पास एक सारणी कक्षा के साथ एक अनुप्रयोग है जो JDialog
फैलाता है। एक abstract void onClose()
के रूप में वर्ग, और वर्ग के निर्माता में, निम्नलिखित कोड जोड़ा जाता है:'विंडो लिस्टनर' अभिनय, शाश्वत फायरिंग
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
onClose();
}
}
घटना जब उम्मीद निकाल दिया जाता है, लेकिन फिर एक अजीब बात होता है। जब इस कक्षा के एक ठोस विस्तार में onClose()
विधि में नया JDialog
बनाने के लिए कोड है, और यह JDialog
का defaultCloseOperation
JDialog.DISPOSE_ON_CLOSE
है, तब तक ईवेंट लगातार निकाल दिया जाता है, जब तक कि मैं ऑपरेशन छोड़ने को मजबूर नहीं करता।
मैं निम्नलिखित SSCCE को कोड अलग है: "मुझे क्लिक करें" बटन पर क्लिक करने पर
// 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);
}
}
, खाली JDialog
प्रकट होता है और SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
कंसोल विंडो में दिखाई देता है। जब मैं खाली संवाद बंद करता हूं, तो यह फिर से दिखाई देता है और पाठ फिर से दिखाई देता है।
जब "क्लिक पर क्लिक:
एक और वास्तव में दिलचस्प बात यह है कि मैं कंसोल में निम्न उत्पादन हो जब मैं
JDialog dialog = new JDialog() {
@Override
public synchronized void addWindowListener(WindowListener l) {
super.addWindowListener(l);
System.out
.println("SSCCE.onClose().new JDialog() {...}.addWindowListener()");
}
};
को
JDialog dialog = new JDialog();
से प्रारंभ लाइन बदल रहा है मुझे "बटन:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
संवाद के पहले समापन पर:
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.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()
हर बार जब मैं संवाद बंद, addWindowListener(WindowListener l)
, एक अतिरिक्त समय कहा जाता है, भले ही यह जानबूझकर इसे बुला रहा नहीं है।
मैं नहीं है वास्तव में किसी भीWindowListener
रों संवाद पर पंजीकृत होना चाहते हैं, लेकिन मुझे लगता है कि बस addWindowListener(...)
विधि अधिभावी और बुला super.addWindowListener(...)
भी खराब नहीं होगा।
मैक ओएस एक्स 10.6.8 पर जावा 1.6.0_31 चला रहा हूं, एक्लिप्स इंडिगो (विंडोबिल्डर के साथ, यदि यह मायने रखता है) का उपयोग कर।
क्या किसी के पास कोई विचार है?
धन्यवाद!
धन्यवाद! यह सही समझ में आता है। – wchargin