2010-05-22 10 views
6

मैंने ApplicationListener के माध्यम से देखा, और उनके पास यह नहीं है। मैक पर, यह तब होता है जब उस एप्लिकेशन में फोकस के बराबर होता है; इसका मेनू शीर्ष मेनू बार में है।मैक पर जावा: जब मैं अपने एप्लिकेशन को फोकस प्राप्त करता हूं तो मुझे कैसे पता चलेगा?

इसके अलावा, अगर आपको यह पता है, तो क्या आप मुझे बता सकते हैं कि मेरा एप्लिकेशन स्वयं को ध्यान केंद्रित करने का अनुरोध कैसे कर सकता है? WindowListener या WindowAdapter में windowActivated() और windowDeactivated() की

उत्तर

5

क्रियान्वयन आपको बता जब एक खिड़की सक्रिय या निष्क्रिय है जाएगा। इसके लिए आपको 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); 
    } 

} 
+0

समस्या यह है कि, मैंने अपनी खिड़की को 'frame.setVisible (false)' का उपयोग कर छुपाया, जो विंडो को छुपाता है, लेकिन मैक के 'छुपा' विकल्प की तरह काम नहीं करता है। यह फ्रेम छुपाता है, हालांकि आवेदन फोकस बरकरार रखता है। 'Frame.toBack()' का उपयोग करके या तो काम नहीं किया; आवेदन फोकस बनाए रखा, बस खिड़की पीछे की ओर ले जाया गया था। मैक पर, जब आप कोई एप्लिकेशन छिपाते हैं, तो एप्लिकेशन अपनी सभी खिड़कियों और डिफोकस को छुपाता है, और जब आप एप्लिकेशन फोकस देते हैं तो उन्हें सभी को अनदेखा करता है। हालांकि, 'frame.setVisible()' के साथ, जब भी आप एप्लिकेशन को डिफोकस करते हैं और इसे वापस फोकस करते हैं, तो यह फिर से दिखाई नहीं देता है। –

+0

(जारी) वे पूरी तरह से अलग तरीके हैं, 'सेट दृश्य()' और एक मैक का छुपा कार्य। समस्या यह है कि, मैं पहले से ही एक विंडो लिस्टनर का उपयोग करता हूं, लेकिन जब मैं इसे फोकस देता हूं तो खिड़की फिर से दिखाई नहीं देती है, इसलिए यह काम नहीं करती है। तुम मेरी बड़ी समस्याएं यहाँ देख रहे हो? मैंने इन कोशिश की है। आपके पास कोई और सुझाव है? मुझे पता है कि शायद आपको मैक के साथ अनुभव नहीं है, लेकिन आप अतीत में बहुत मददगार रहे हैं। –

+0

@ स्टुअर्ट: 'toBack()' फोकस के बारे में कोई वादा नहीं करता है। AFAIK, स्विचिंग अनुप्रयोग उपयोगकर्ता का अधिकार है। उपर्युक्त उदाहरण दो विंडो के लिए 'विंडो' ईवेंट दिखाता है, लेकिन आप ट्यूटोरियल का भी पता लगा सकते हैं। – trashgod

1

तुम मुझे बताओ कैसे अपने आवेदन डी-फोकस ही अनुरोध कर सकते हैं सकता है?

आप कोशिश कर सकते हैं:

frame.toBack(); 

वह काम नहीं करता है तो आप अपने आवेदन में जो मामले फोकस पिछले आवेदन के पास जाना चाहिए iconify कर सकते हैं।

frame.setExtendedState(...); 
+0

संदर्भ के लिए, मैक ओएस एक्स – trashgod

0

जावा प्रोग्रामिंग भाषा प्लेटफ़ॉर्म-स्वतंत्र है। ऐप्पल के संदर्भ दस्तावेज़ीकरण को पढ़ने के बजाय, आपको आधिकारिक Java API Reference Documentation का उपयोग करना चाहिए। वहां आपको JFrame, WindowListener, और WindowAdapter के लिए दस्तावेज़ मिलेगा। addWindowListener फ़ंक्शन का उपयोग करके आप एक जेफ्रेम पर विंडो लिस्टनर पंजीकृत कर सकते हैं। खिड़की श्रोता का उपयोग सक्रिय/निष्क्रिय (जो खिड़की शीर्ष पर है) सहित विभिन्न विंडो-संबंधित घटनाओं को रोकने और संभालने के लिए किया जा सकता है या फोकस/खोया फोकस प्राप्त किया जा सकता है (कौन सी विंडो कुंजीपटल घटनाएं प्राप्त करेगी)। यदि आप अपना खुद का विंडो लिस्टर प्रदान कर रहे हैं और प्रत्येक फंक्शन को कार्यान्वित नहीं करना चाहते हैं, तो विंडो एडाप्टर उस उद्देश्य के लिए उपयोगी है क्योंकि यह विंडो लिस्टनर लागू करता है लेकिन प्रत्येक फ़ंक्शन के लिए खाली परिभाषा प्रदान करता है। डिफोक्यूजिंग के लिए (जिसका अर्थ है कि आप मतलब है), toBack इसका उपयोग किया जा सकता है, जबकि toFront विपरीत है।

संपादित करें
इनमें से अधिकतर जानकारी पहले से ही पिछली पोस्ट में दी गई थी; हालांकि, मैंने इसे जोर देने के लिए जोड़ा:

  • जावा एक प्लेटफ़ॉर्म-स्वतंत्र भाषा है।
  • जावा सूर्य माइक्रोसिस्टम्स (अब ओरेकल) का एक उत्पाद है।
  • लगातार, ऐप्पल द्वारा आधिकारिक Java API Reference Documentation का उपयोग करके ऐप्पल द्वारा प्रदत्त किसी भी संदर्भ दस्तावेज पर निर्भर होने से अधिक समझदारी होती है, क्योंकि आधिकारिक एपीआई संदर्भ दस्तावेज में निहित कुछ भी सभी प्लेटफॉर्म पर काम करेगा; जबकि, ऐप्पल के संदर्भ दस्तावेज से कुछ भी ऐप्पल के कार्यान्वयन के लिए विशिष्ट होना बहुत अच्छा हो सकता है।
  • आधिकारिक, आधिकारिक संदर्भ दस्तावेज से JFrame के लिए संदर्भ प्रलेखन प्रश्न का उत्तर देने के लिए आवश्यक सभी जानकारी देता है (इसलिए ऐप्पल के दस्तावेज़ीकरण पर निर्भर होने के बजाय आधिकारिक एपीआई संदर्भ दस्तावेज से परामर्श करने का एक अन्य कारण)।
+0

-1 पर अपेक्षित दोनों कार्य, विंडोलिस्टर को 6 घंटे पहले सुझाव दिया गया था। टूबैक() को 5 घंटे पहले सुझाव दिया गया था। मुझे सुझाव दोहराने का कोई कारण नहीं है। – camickr

+0

इसके अलावा, 'एप्लिकेशन लिस्टनर' को मुख्य यूआई, सप्लांट के बजाय पूरक करने का इरादा है। मेरे उत्तर में उद्धृत 'OSXAdapter' उदाहरण' के लिए 'README.txt' देखें। – trashgod

+0

@camickr, मैं आधिकारिक संदर्भ दस्तावेज के उपयोग पर जोर देना चाहता था (मेरा संपादन देखें)। इसके अलावा, अन्य यह इंगित करने में विफल रहते हैं कि जावा शब्दावली में "फोकस" का अर्थ है कीबोर्ड फोकस (कौन सी विंडो शीर्ष पर नहीं है), जो मेरा उत्तर भी देता है। –

संबंधित मुद्दे

 संबंधित मुद्दे