2011-01-25 28 views
13

मैं जावा ऐप (स्विंग जीयूआई) लिख रहा हूं जो समय-समय पर जेएफआरएएम पॉप अप करता है।क्या जेएफआरएएम को सामने लाया जा सकता है लेकिन ध्यान केंद्रित नहीं किया जा सकता है?

क्या खिड़की को सामने लाने के लिए किसी भी तरह से संभव है (foo.setAlwaysOnTop (true) भी बेहतर होगा) लेकिन बिना पर ध्यान केंद्रित किया जा रहा है?

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

अन्य मामलों में, उपयोगकर्ता कीबोर्ड पर हर समय की तलाश में, एक पॉप-अप विंडो और ध्यान पाने के पॉप-अप विंडो में ही (कुछ Tab + Enter से अवांछित कार्यों का कारण बन सकता बिना वास्तव में टाइपिंग करने में सक्षम है, तब भी जब उदाहरण के लिए संयोजन, जहां उपयोगकर्ता गलती से एक विकल्प चुनता है जिसे वह वास्तव में अन्यथा नहीं चुना होता)।

अग्रिम धन्यवाद!

अद्यतन

जोनास पता चलता है, foo.setFocusableWindowState(false); अगर बाद खिड़की गाया गया है (केवल Gnome पर परीक्षण) कहा जाता है काम करने के लिए लगता है।

यह काम नहीं करता:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
foo.setFocusableWindowState(true); 

हालांकि, इस करता:

foo.setFocusableWindowState(false); 
foo.setVisible(true); 
Thread.sleep(1000); 
foo.setFocusableWindowState(true); 

मैं वहाँ एक घटना मैं पकड़ कर सकते हैं अगर देखने के लिए होगा/मुझे करने की अनुमति देता है कि करने के लिए सुनो उपयुक्त होने पर foo.setFocusableWindowStatue(true); करें।

मुझे लगता है कि मेरी समस्या हल हो गई है।

+1

क्या आपको कभी भी फ़्रेम प्रदान किए जाने के लिए सुनने के लिए कोई ईवेंट मिला? – lordoku

+0

क्या किसी ने कभी भी यहां सुनने के लिए एक कार्यक्रम खोजा है जो काम करता है? – wrslatz

उत्तर

13

यह काम कर सकते हैं:

foo.setFocusableWindowState(false); 
+0

यह वास्तव में काम करता प्रतीत होता है, लेकिन मुझे या तो टाइमर सेट करना होगा या कुछ ईवेंट ढूंढना होगा जब मैं 'setFocusableWindowState' को वापस' सत्य 'करने की अनुमति देता हूं। –

+0

@ जोहान आप 'जेएफआरएएम' के बजाय 'विंडो' का उपयोग करने का भी प्रयास कर सकते हैं। मुझे लगता है कि फोकस को नियंत्रित करने के लिए आपके पास अधिक संभावनाएं हैं। – Jonas

0

सुझाव:

frameJustCreated.requestFocus(); 
this.requestFocus(); 

1 एक शीर्ष करने के लिए नए JFrame की खिड़की लाना: जीयूआई घटक है कि फ्रेम बनाता में, लगातार 2 कॉल डाल , दूसरा खिड़की रखता है जहां उपयोगकर्ता शीर्ष पर टाइप कर रहा है।

+0

मुझे बहुत खेद है! मुझे यह उल्लेख करना चाहिए था कि यह एकमात्र खिड़की है जिसका मेरा प्रभारी प्रभारी है। "अन्य" विंडोज़ केवल अन्य प्रोग्राम हैं जो उपयोगकर्ता चल रहे हैं .. –

1

मैं हाल ही में एक ही समस्या में पड़ गए, और अस्थायी समाधान कर दिया गया है:

JFrame frame = ...; 
frame.setExtendedState(JFrame.NORMAL); 
frame.setAlwaysOnTop(true); 
frame.requestFocus(); 
frame.setAlwaysOnTop(false); 
+0

जो काम करता है अगर वहां केवल एक जेएफआरएम है, और कोई पृष्ठभूमि कार्य नहीं है, तो कृपया अपना खुद का धागा शुरू करें (यदि आप इस धागे के लिंक के साथ चाहते हैं), यह बहुत कठिन काम है कि बिना सेट (सत्य/फ्लेज़) के, लेकिन यह क्रिया स्क्रीन पर दिखाई दे रही है, उत्तर जेडियलोग का उपयोग करता है, केवल यही (जिसका अर्थ है विंडोज ओएस) आप माध्यमिक मुद्दों के बिना ऐसा कर सकते हैं – mKorbel

+1

यह बिल्कुल सही नहीं है , क्योंकि मेरे पास मेरे आवेदन में एकाधिक जेएफआरएम्स चल रहे हैं। जब कोई उपयोगकर्ता मेरे पास समान सटीक समस्या का वर्णन कर रहा है, तो नया धागा क्यों शुरू करें, फिर भी समाधान पूरा नहीं हुआ है? जेडियलोग के लिए, यह विंडो के इच्छित उद्देश्य के लिए हमेशा उपयुक्त नहीं है, जो मेरा मामला भी है। –

+0

हाँ शायद मैं झटके के बिना ऐसा करता हूं, लेकिन यह कोड इस धागे से अधिक लंबा है, वास्तव में अच्छा तरीका नहीं है, फ़ोकस betweens को दो या दो से अधिक JFrames पर स्विच न करें, एक जेएफआरएएम को दूसरे में लाएं, फोकस (जेफ्रेम या जेडियलॉग के समान) आया मूल ओएस से और असीमित है, तो मैनेज करने योग्य तो इतना कठिन है, – mKorbel

2

जावा 1.7 के रूप में आप में आप कॉल करना setFocusableWindowState (सही) चाहते हैं

frame.setAutoRequestFocus(false); 
0

कॉल कर सकते हैं एक घटना (इसलिए, उदाहरण के लिए 1 सेकंड का इंतजार नहीं करना), आप एक विंडो लिस्टनर (उदाहरण के लिए विंडो एडाप्टर से व्युत्पन्न) जोड़ सकते हैं जो संपत्ति को बदलता है:

appFrame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      super.windowOpened(e); 
      e.getWindow().setFocusableWindowState(true); 
     } 
    }); 

    appFrame.setFocusableWindowState(false); 
    appFrame.setVisible(true); 
संबंधित मुद्दे