2012-06-27 17 views
15

बदलता है मुझे एक अजीब समस्या है। मैं खिड़की (= जेएफआरएएम और विंडोज़ पर) के लिए शून्य लेआउट का उपयोग कर रहा हूं और यदि मैं setResizable (false) का उपयोग करता हूं तो विंडो का आकार बड़ा हो जाता है (दाएं और नीचे, लगभग 10 पिक्सल मैं कहूंगा)। मुझे नहीं पता क्यों।जावा सेट रीज़ेजेबल (झूठा) विंडो आकार (स्विंग)

दो println के एक ही आकार लौटने के लिए, क्या ..., अजीब बात है भी

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
mainWnd.setTitle(wndTitle); 
mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 
mainWnd.setResizable(false); 
System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 

किसी एक विचार है करता है? खिड़की का आकार क्यों बदलता है?

अद्यतन: ही यहाँ (के साथ और setResizable बिना और आप इसे देख सकते हैं की तुलना में यह संकलन, यदि आप खिड़कियों ओवरलैप) बात:

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Main 
{ 
    private static JFrame mainWnd = null; 

    public static void main(String[] args) 
    { 
     mainWnd = new JFrame(); 

     mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWnd.setTitle("asda"); 
     mainWnd.setBounds(50, 50, 300, 300); 

     mainWnd.setResizable(false); 

     mainWnd.setVisible(true); 
    } 
} 
+0

बेहतर होगा कि तुम और जल्दी जवाब मिल जाएगा अगर आप एक [SSCCE] (http://sscce.org) दिखा। – assylias

+0

एक उदाहरण है, बाकी को पेस्ट नहीं कर सकता है, क्योंकि इसके पीछे एक एक्सएमएल-पार्सर काम करता है और बहुत कुछ ... और समस्या बस सेट करने योग्य कॉल – immerhart

+0

के साथ होती है, मैं व्यवहार को पुन: उत्पन्न नहीं कर सकता। तो सभी अनावश्यक हिस्सों से छुटकारा पाने की कोशिश करें और एक संकल्पनीय और चलने योग्य उदाहरण पोस्ट करें जिसमें आपके द्वारा उल्लेख किया गया व्यवहार है। – assylias

उत्तर

13

यह तो आप चाहिए, मेरे उदाहरण पर नहीं बदलता है

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class Test4 { 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setBounds(0, 0, 300, 200); 
     frame.setVisible(true); 
     System.err.println(frame.getSize()); 
     frame.setResizable(false); 
     System.err.println(frame.getSize()); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 

संपादित करें/अद्यतन: जब आप (गलत पर आकार बदलने योग्य सेट कम से कम

किसी तरह सन्निवेश वाली ग़लत हैं कुछ और है कि आपकी समस्या का कारण बनता है है विंडोज 7 और जेडीके 6 पर)। किसी भी तरह वे 30,8,8,8 से 25,3,3,3 में बदलते हैं, हालांकि सीमा (जिसे ओएस द्वारा चित्रित किया जाता है) वास्तव में वही रहता है। चूंकि इन्सेट फ़्रेम की सीमाओं का हिस्सा हैं, इसलिए फ्रेम वास्तव में बहुत बड़ा (दृश्यमान) होता है जब यह आकार बदलने योग्य नहीं होता है। मेरे लिए ऐसा लगता है कि फ्रेम आकार बदलने योग्य नहीं है जब गणना आकार में एक बग है।

+0

यहां वही ...... – assylias

+1

मुझे लगता है कि आपको दोनों खिड़कियां शुरू करनी चाहिए, फिर आप देखेंगे कि आकार बदलने योग्य नहीं है! – immerhart

+1

किसी भी तरह से इन्सेट गलत हैं जब आप झूठ में आकार बदलने योग्य सेट करते हैं (कम से कम विंडोज 7 और जेडीके 6 पर)। किसी भी तरह वे 30,8,8,8 से 25,3,3,3 में बदलते हैं, हालांकि सीमा वास्तव में वही रहती है। चूंकि इन्सेट फ़्रेम की सीमाओं का हिस्सा हैं, इसलिए फ्रेम वास्तव में बहुत बड़ा (दृश्यमान) होता है जब यह आकार बदलने योग्य नहीं होता है। मेरे लिए ऐसा लगता है कि फ्रेम आकार बदलने योग्य नहीं है जब गणना आकार में एक बग है। –

1

एल & पर निर्भर करता है आकार बदलने योग्य (गलत/सत्य) सेटिंग विंडो सीमा सजावट बदल सकता है। कोई अधिकतम नहीं, आकार बदलने वाला तीर नहीं। वह स्वयं आकार बदल सकता है।

+0

मेरे मामला, कोई अन्य एल एंड एफ सेट के साथ, उदाहरण के लिए, डिफ़ॉल्ट रूप से दिखने और महसूस करने के साथ, यह विंडोज़ आकार भी बदलता है। – FaithReaper

1

बदलें:

frame.setResizable(false); 

रहे हैं:

SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      frame.setResizable(false); 
     } 
    }); 
+0

समस्या बनी रहती है। यह एक समाधान नहीं है। – FaithReaper

4

आप सीमा निर्धारित करने से पहले setResizable झूठी सेट करते हैं, आप समस्या नहीं होगी। चूंकि गर्जली सिज़लाजी ने पहले कहा था, आप स्क्रॉलबार से छुटकारा पा रहे हैं, लेकिन खिड़की का आकार बंद कर दिया गया है और इसलिए आप फ्रेम में 9 या 10 पिक्सेल अतिरिक्त जगह के साथ समाप्त हो जाते हैं। मुझे बस एक ही समस्या थी। सहायता के लिए धन्यवाद।

+0

नहीं, यह मुझे दो जेएफआरम्स के बीच अंतर देता रहता है। – FaithReaper

0

अब तक इस कष्टप्रद मुद्दे के लिए सबसे अच्छा पैच निम्न है। कोई फर्क नहीं पड़ता कि आप setResizable(false) विधि कहां कॉल करते हैं। setVisible(true) के बाद बस कोड का यह टुकड़ा जोड़ें।

private void sizeBugPatch() { 
    while (frame.getWidth() > yourWidth) { 
     frame.pack(); 
    } 
} 

कहाँ yourWidthचौड़ाई आप संभव तरीकों में से किसी में सेट किया है, या तो स्वयं या setPreferredSize तरीकों अधिभावी कर रहा है। स्पष्टीकरण काफी आसान है, frame.pack() किसी भी तरह frame.setResizable(boolean b) रीसेट करने लगता है। आप while लूप के बजाय if का उपयोग कर सकते हैं, लेकिन मैं while को अन्य pack() के बाद भी अतिरिक्त आकार के मामले को बाहर करने के लिए while पसंद करता हूं।

0

मेरे पास 2 जेएफआरएम सबक्लास परिभाषित हैं। यदि मैं एक स्टैंडअलोन ऐप में समस्या फ्रेम चलाता हूं, तो फ्रेम का आकार सही है। यदि मैं एक स्टैंडअलोन ऐप में दोनों फ्रेम चलाता हूं, तो समस्या फ्रेम अभी भी बड़ा है। मैंने पैक से पहले सेट करने योग्य (झूठा) सेट किया था, और मुझे अभी भी समस्या है।मेरा कामकाज लेआउटलायआउट में लेआउट को बदलना था और केंद्र में (छवि) पैनल को प्लॉप करना था, फिर सेट रीज़ेज़ेबल किया गया था।

1

खैर मैं इस समस्या को मिले हैं और यह

क्यों आकार बदलने योग्य फ्रेम का एक सन्निवेश वाली है एक देखो & समस्या महसूस होता है ... (5, 5, 5, 5)? यह मुझे लगता है कि इसे आकार बदलने योग्य बनाता है फ्रेम के चारों ओर कुछ अतिरिक्त घटक जोड़ता है, जैसे ... का आकार बदलने के लिए किसी प्रकार का "हैंडलर" खींचें?

और फिर मैंने पाया कि यदि हम डिफ़ॉल्ट जावा धातु एल & एफ का उपयोग करते हैं और setDefaultLookAndFeelDecorated(true) सेट करते हैं, तो हैंडलर चित्रित किया जाएगा और इस प्रकार, फ्रेम आकार में नहीं बदलेगा। लेकिन निंबस में, मोटीफ और विंडोज एल & एफ इस बिंदु को लागू नहीं किया गया है, इसलिए यह एक बग है। मैं इसकी रिपोर्ट करूंगा।

मेरा अपना सवाल और GIF के साथ मेरा उत्तर यहाँ है:

Swing - setResizable(true) make JFrame title bar higher and window size smaller

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