क्रियान्वयन आपको बता जब एक खिड़की सक्रिय या निष्क्रिय है जाएगा। इसके लिए आपको ApplicationListener
की आवश्यकता नहीं है।
परिशिष्ट: हालांकि इस मामले में आवश्यक नहीं है, ApplicationListener
में निर्दिष्ट अतिरिक्त कार्यक्षमता का पारदर्शी कार्यान्वयन इस example में पाया जा सकता है।
परिशिष्ट: How to Write Window Listeners भी देखें।
परिशिष्ट: मुझे लगता है कि मैं देखता हूं कि आपका क्या मतलब है। उदाहरण में OSXAdapter
, जो -Dapple.laf.useScreenMenuBar=true
का उपयोग करता है, अंतिम विंडो (HIDE_ON_CLOSE
डिफ़ॉल्ट रूप से) बंद होने पर मेनू गायब हो जाता है। यह इष्टतम से कम है, लेकिन About…
और Preferences
मेनू मेनू मेनू में रहते हैं; या तो स्क्रीन मेनू को पुनर्स्थापित कर रहा है। एक और संभावना com.apple.eawt.Application
में डॉक मेनू को संशोधित करना है।
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class WindowTest extends JFrame implements ActionListener,
WindowListener, WindowFocusListener, WindowStateListener {
public static final void main(String args[]) throws Exception {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WindowTest("One");
new WindowTest("Two");
}
});
}
public WindowTest(String name) {
super(name);
this.setName(name);
this.setLayout(new GridLayout(0, 1));
createButton("Back");
createButton("Front");
createButton("Hide");
this.addWindowListener(this);
this.addWindowFocusListener(this);
this.addWindowStateListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.pack();
this.setVisible(true);
}
private void createButton(String name) {
JButton b = new JButton(name);
this.add(b);
b.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if ("Back".equals(s)) {
this.toBack();
} else if ("Front".equals(s)) {
this.toFront();
} else {
this.setExtendedState(JFrame.ICONIFIED);
}
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowGainedFocus(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowLostFocus(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowStateChanged(WindowEvent e) {
System.out.println(e);
}
}
समस्या यह है कि, मैंने अपनी खिड़की को 'frame.setVisible (false)' का उपयोग कर छुपाया, जो विंडो को छुपाता है, लेकिन मैक के 'छुपा' विकल्प की तरह काम नहीं करता है। यह फ्रेम छुपाता है, हालांकि आवेदन फोकस बरकरार रखता है। 'Frame.toBack()' का उपयोग करके या तो काम नहीं किया; आवेदन फोकस बनाए रखा, बस खिड़की पीछे की ओर ले जाया गया था। मैक पर, जब आप कोई एप्लिकेशन छिपाते हैं, तो एप्लिकेशन अपनी सभी खिड़कियों और डिफोकस को छुपाता है, और जब आप एप्लिकेशन फोकस देते हैं तो उन्हें सभी को अनदेखा करता है। हालांकि, 'frame.setVisible()' के साथ, जब भी आप एप्लिकेशन को डिफोकस करते हैं और इसे वापस फोकस करते हैं, तो यह फिर से दिखाई नहीं देता है। –
(जारी) वे पूरी तरह से अलग तरीके हैं, 'सेट दृश्य()' और एक मैक का छुपा कार्य। समस्या यह है कि, मैं पहले से ही एक विंडो लिस्टनर का उपयोग करता हूं, लेकिन जब मैं इसे फोकस देता हूं तो खिड़की फिर से दिखाई नहीं देती है, इसलिए यह काम नहीं करती है। तुम मेरी बड़ी समस्याएं यहाँ देख रहे हो? मैंने इन कोशिश की है। आपके पास कोई और सुझाव है? मुझे पता है कि शायद आपको मैक के साथ अनुभव नहीं है, लेकिन आप अतीत में बहुत मददगार रहे हैं। –
@ स्टुअर्ट: 'toBack()' फोकस के बारे में कोई वादा नहीं करता है। AFAIK, स्विचिंग अनुप्रयोग उपयोगकर्ता का अधिकार है। उपर्युक्त उदाहरण दो विंडो के लिए 'विंडो' ईवेंट दिखाता है, लेकिन आप ट्यूटोरियल का भी पता लगा सकते हैं। – trashgod