2012-12-05 13 views
5

मैं जेबटन टेक्स्ट के फ़ॉन्ट आकार को स्वचालित रूप से बढ़ाने/घटाने की कोशिश कर रहा हूं (यदि जेबटन अपने टेक्स्ट को बढ़ाता है तो बढ़ाएगा, यदि जेबटन अपने टेक्स्ट को कम करता है तो भी कम हो जाएगा)। जेबट्टन का डिफ़ॉल्ट फ़ॉन्ट सैन्स-सेरिफ़ आकार 20 होगा और यह 20 से नीचे कभी भी कम नहीं हो सकता है (यह 21, 30, 40 या 20 से ऊपर या उसके बराबर कुछ भी हो सकता है लेकिन 20 से कम कुछ भी नहीं)। मेरे पास एक जेपीनेल है, जिसे मेन्यूजेनल कहा जाता है, यह ग्रिडलाउट का उपयोग 5 जेबूटन जोड़ने के लिए करता है जो जेपीनेल बढ़ने/मृतकों के आकार में वृद्धि/कमी करेगा। मैंने ग्रिडलाउट चुना क्योंकि यह इस उद्देश्य के लिए सबसे अच्छा लेआउट प्रतीत होता है, क्या मैं गलत हूं? मैंने मेनू जेपीनेल में एक घटक भी जोड़ा है। नीचे आप मेरा कोड देख सकते हैं जो आंशिक रूप से काम करता है।जेबटन के आकार के आधार पर जेबटन टेक्स्ट के आकार को स्वचालित रूप से कैसे बढ़ाया या धोखा देना है?

enter image description here

public class MenuJPanel extends JPanel { 

    private JButton resizeBtn1; 
    private JButton resizeBtn2; 
    private JButton resizeBtn3; 
    private JButton resizeBtn4; 
    private JButton resizeBtn5; 

    public MenuJPanel() { 
     initComponents(); 
     this.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 

       Font btnFont = resizeBtn1.getFont(); 
       String btnText = resizeBtn1.getText(); 

       int stringWidth = resizeBtn1.getFontMetrics(btnFont).stringWidth(btnText); 
       int componentWidth = resizeBtn1.getWidth(); 

       // Find out how much the font can grow in width. 
       double widthRatio = (double) componentWidth/(double) stringWidth; 

       int newFontSize = (int) (btnFont.getSize() * widthRatio); 
       int componentHeight = resizeBtn1.getHeight(); 

       // Pick a new font size so it will not be larger than the height of label. 
       int fontSizeToUse = Math.min(newFontSize, componentHeight); 

       // Set the label's font size to the newly determined size. 
       resizeBtn1.setFont(new Font(btnFont.getName(), Font.BOLD, fontSizeToUse)); 
      } 
     }); 
    } 

    private void initComponents() { 

     resizeBtn1 = new javax.swing.JButton(); 
     resizeBtn2 = new javax.swing.JButton(); 
     resizeBtn3 = new javax.swing.JButton(); 
     resizeBtn4 = new javax.swing.JButton(); 
     resizeBtn5 = new javax.swing.JButton(); 

     setLayout(new java.awt.GridLayout(5, 0)); 

     resizeBtn1.setText("Text to resize 1"); 
     add(resizeBtn1); 

     resizeBtn2.setText("Text to resize 2"); 
     add(resizeBtn2); 

     resizeBtn3.setText("Text to resize 3"); 
     add(resizeBtn3); 

     resizeBtn4.setText("Text to resize 4"); 
     add(resizeBtn4); 

     resizeBtn5.setText("Text to resize 5"); 
     add(resizeBtn5); 
    } 
} 
+3

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

+0

धन्यवाद, मैंने बस उदाहरण कोड – jadrijan

+1

तय किया है, क्या आप आंतरिक क्षेत्र की गणना करने में सक्षम हैं (जेबटन के बारे में लाइन देखें यदि) चुना गया है अर्थात् जेबटन से इंससेट प्राप्त करें और सीमाओं के लिए 1 पिक्सेल घटाएं (जेबटन के बारे में लाइन देखें, तो परिणाम SwingUtilities # computeStringWidht के लिए आयाम उपलब्ध है :-) – mKorbel

उत्तर

5

आमतौर पर, एक JButton के लिए ButtonUI प्रतिनिधि बटन के पसंदीदा डिजाइनर की चुनी हुई फ़ॉन्ट और मंच के सौंदर्यशास्त्र पर आधारित आकार गणना करता है। चूंकि आपका दृष्टिकोण इस बात को पराजित करता है, यह तय करने के लिए आप टेक्स्ट के साथ स्केल करेंगे और बटन सजावट को समायोजित करेंगे।

अनुपस्थित अपने ButtonUI बनाते हुए, आप बस पाठ को स्केल कर सकते हैं। इस example में, TextLayout को BufferedImage में एक मनमाने ढंग से बड़े आकार में पाठ प्रस्तुत करने के लिए उपयोग किया जाता है जिसे आवश्यकतानुसार घटाया जा सकता है। इस example में, एक अंक की ग्लिफ BufferedImage में प्रस्तुत की जाती है और बटन के वर्तमान आकार में फिट करने के लिए स्केल की जाती है। यदि आपको Icon की सापेक्ष स्थिति से निपटने की आवश्यकता है, तो SwingUtilities.layoutCompoundLabel() देखें, here की जांच की गई।

+0

इस उत्तर के लिए बहुत बहुत धन्यवाद। मेरे पास एक और सवाल है, क्या होगा यदि मेरे जेबटन का टेक्स्ट उदाहरण के लिए एचटीएमएल का उपयोग करता है: " लाइन 1
लाइन 2", क्या उपर्युक्त उदाहरण अभी भी काम करेंगे? – jadrijan

+0

धन्यवाद, मैं इसे आज़माउंगा और आपको – jadrijan

+0

बता दूंगा; मुझे यकीन नहीं है; 'layoutCompoundLabel()' इसे संभाल सकता है। 'जेनबेल' को प्रस्तुत करना आसान हो सकता है, जैसा कि [जेपीएनएल '[संपादित] के लिए [यहां] (http://stackoverflow.com/a/7028497/230513) दिखाया गया है। – trashgod

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