2013-02-14 55 views
5

मूल रूप से (मेरा पिछला प्रश्न "Java how to make JFrames start off as a maximised window" देखें) मैं एक खिड़की बनाना चाहता था जो अधिकतम से शुरू होता है। इस कोड को पूरा करता है:जावा जेएफआरएक्स को अधिकतम करने के लिए कैसे करें, लेकिन आकार बदलने योग्य नहीं

public static void main(String[] args) { 

JFrame frame = new JFrame(); 
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

} 

हालांकि, अगर इस विंडो नीचे पुनर्स्थापित किया जाता है यह एक व्यावहारिक रूप से न के बराबर बार हो जाता है। इसे हल करने के लिए मैंने setSize() का उपयोग कर विंडो के लिए एक आकार सेट किया है। यह काम करता है लेकिन एक और समस्या प्रस्तुत करता है, खिड़की अभी भी आकार बदल सकती है।

इस समस्या को हल करने के लिए मैंने सेट को सेट करने योग्य (झूठा) सेट किया है;

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

हालांकि, अब खिड़की से बाहर अपने निर्दिष्ट आकार (बल्कि अधिकतम की तुलना में) पर शुरू होता है और ऊपर से बहाल नहीं किया जा सकता: और यह मेरा कोड अब तक है।

तो, मेरा सवाल यह है कि, मैं या तो खिड़की को अधिकतम कैसे शुरू कर सकता हूं, इसे आकार देने के लिए आकार देता हूं और इसे आकार बदलना असंभव हो जाता है? या एक खिड़की बनाओ जो अधिकतम से शुरू होता है और इसे बहाल नहीं किया जा सकता है?

उत्तर

3

उन्हें आसानी से ठीक है कि लगभग सभी समय काम करता है नहीं है: अपने फ्रेम आकार बदलने योग्य नहीं दिखाई सेट होने के बाद बनाते हैं।

public static void main(String[] args) { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    JFrame frame = new JFrame("Jedia"); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setSize(screenSize); 
    frame.setVisible(true); // FIRST visible = true 
    frame.setResizable(false); // THEN resizable = false 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

इस तरह, फ्रेम अधिकतम शुरू हो जाता है और बड़ा करें बटन धूसर हो जाएगा, इसका इस्तेमाल करने के लिए उपयोगकर्ता को रोकने: तो केवल अपने कोड इस तरह से संशोधित करता है। (मैं वास्तव में तुम क्यों यह करने के लिए है। मैं अधिकतम राज्य वास्तव में लागू किया जाता है मान लें कि पता नहीं है केवल जब खिड़की दिखाई देने लगता है, और यदि आप इसे पहले unresizable बनाने के लिए, यह लागू नहीं होगा।)

यह काम करता है लगभग सब क्योंकि विंडोज 7 पर समय कम से कम आप खिड़की बना सकते हैं शीर्षक पट्टी पर क्लिक करके और खींच कर अधिकतम राज्य के बाहर चला जाता है। लेकिन यह उस आकार पर होगा जिसे आपने पहले सेट किया था। समस्या यह है कि अपने उपयोगकर्ता इसे फिर से अधिकतम करने के लिए सक्षम नहीं होगा है, और मैं श्रोताओं के साथ जिस तरह से खिड़की वापस अधिकतम राज्य के लिए बनाने के लिए नहीं मिली है। ( संपादित करें: @ डेविड क्रौकैम्प अपने उत्तर के आखिरी हिस्से में दिखाता है कि एक घटक लिस्टनर का उपयोग करके अधिकतम राज्य को मजबूर करना संभव है। इसलिए आपको setResizable(false) का उपयोग करने की आवश्यकता नहीं है इस तरह आपको अभी भी विंडोज 7 के साथ समस्या है क्योंकि घसीट कार्रवाई के लिए जो भी कारण है, लेकिन उन अधिकतम बटन का उपयोग करने के लिए इसे वापस डाल करने के लिए जहां यह होना चाहिए में सक्षम हो जाएगा इस घटना से catched नहीं है।)

अब, वहाँ लगभग इस तरह करने के लिए एक कारण नहीं है की चीज़ों का। उपयोगकर्ता वास्तव में जब आप उन्हें उनकी खिड़कियों में हेरफेर करने को रोकने पसंद नहीं है (अधिकतम खिड़कियां नहीं ले जाया जा सकता है, उदाहरण के लिए, और आप एकाधिक स्क्रीन है, जब कि कष्टप्रद हो सकता है)। एक अपवाद यह है कि यदि आप एक गेम बना रहे हैं, जो आम तौर पर पूर्ण स्क्रीन है। लेकिन फिर आप एक जेफ्रेम नहीं चाहते हैं क्योंकि आप सभी सजावट नहीं चाहते हैं, लेकिन एक खिड़की।

यदि आपकी समस्या यह है कि डिफ़ॉल्ट विंडो आकार बहुत छोटा है, तो यह सामान्य है। तुम कुछ अपने फ्रेम में पहले, (कुछ नियंत्रण, बटन, क्या आप अपने आवेदन में चाहते हैं) डाल करने के लिए लेआउट का उपयोग कर (कि महत्वपूर्ण है) फिर अपने फ्रेम पर विधि pack() फोन है। यह आपकी खिड़की के लिए एक अच्छा डिफ़ॉल्ट आकार चुना जाएगा।

अंत में, एक अंतिम शब्द। मैं एक शॉर्टकट के रूप में एक main विधि में मेरे उदाहरण कोड डाल दिया है, लेकिन आप हमेशा SwingUtils.invokeLater() का उपयोग करके स्विंग EDT में सामान स्विंग करते चाहिए।

+1

बहुत बहुत धन्यवाद! यह काम। आप के साथ ईमानदारी से कहूं तो मैं केवल अभी स्विंग कमाई तो मैं बस वास्तव में कुछ करने के लिए इसे लागू करने के बजाय यह करने के लिए सक्षम होने के लिए करना चाहता था शुरू कर दिया है! एक बार फिर धन्यवाद! –

0

क्या पर्यावरण आप पर चल रहे हैं? मैं Win7 के तहत JDK1.6/JDK1.7 के साथ इस की कोशिश की और यह के रूप में की उम्मीद (विंडो शुरू होता है को बड़ा किया, कार्य पट्टी करने के लिए कम से कम) काम करता है।

+0

मैं मध्य बटन के बारे में बात कर रहा हूँ, "बहाल"। कम से कम करने के लिए कुछ भी नहीं। बिना सेट के कोड को चलाएं और आप देखेंगे कि मैं इसे कैसे शुरू करना चाहता हूं। –

1

कभी-कभी, आपको JFrame पैरामीटर सेट करने के आदेश के बारे में सावधान रहना होगा।

इसके अलावा, आपको ईवेंट प्रेषण धागे पर स्विंग घटकों का उपयोग करना चाहिए।

इस प्रयास करें और देखें अगर यह मदद करता है।

public static void main(String[] args) {   
    final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame frame = new JFrame("Jedia"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(screenSize); 
      frame.setResizable(false); 
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      frame.setVisible(true); 
     } 
    }); 
} 
+0

नहीं कि खिड़की को अधिकतम नहीं किया गया है। इसे अभी भी चारों ओर खींचा जा सकता है और पुनर्स्थापित बटन अनुपयोगी है। फिर भी धन्यवाद। –

0

मेरे पास आपके लिए एक हैक है जो काम कर सकता है। इस कोड (यह मेरे लिए काम किया) का प्रयास करें:

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Jedia"); 
    frame.setMinimumSize(new Dimension(600, 400)); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    frame.addComponentListener(new ComponentListener(){ 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void componentResized(ComponentEvent e) { 

      if (!e.paramString().startsWith("COMPONENT_RESIZED (-8,-8")) 
      frame.setSize(new Dimension(600, 400)); 
     } 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 

e.paramString() एक स्ट्रिंग की तरह दिखता रिटर्न "COMPONENT_RESIZED (-8, -8, [screensize])" जब एक कार्रवाई बहाल जगह लेता है।