2012-02-16 9 views
5

यहां एक समान प्रश्न है: How to change the size of the font of a JLabel to take the maximum sizeआकार बदलने के दौरान जेपीनेल मुक्त स्थान भरने के लिए जेएलएबल फ़ॉन्ट आकार को कैसे बदला जाए?

लेकिन यह पीछे की ओर काम नहीं करता है।

तो अगर आप JPanel बनाने बड़ा, फ़ॉन्ट से बढ़ रहा है, लेकिन अगर आप इसे के रूप में पहले

Check this Image

कैसे JlabelJPanel आकार के अनुसार, जबकि आकार बदलने से बढ़ फ़ॉन्ट बनाने के लिए JLabel आकार और फ़ॉन्ट रहने छोटे?

+0

क्या आप जब फ्रेम आकार सिकुड़ता है इस समस्या को ठीक करने के लिए कोड modyifying कोशिश? – camickr

उत्तर

0

ठीक है, यहाँ जवाब है।

के यहां से कोड डालें: How to change the size of the font of a JLabel to take the maximum size, से जवाब coobird

int componentWidth = label.getWidth(); 

हम JLabel से JFrame घटक से चौड़ाई प्राप्त करने के लिए, नहीं की जरूरत है, क्योंकि कोड नहीं देना अवसर के लिए आकार बदलने के लिए होगा जेएलएबल

इस इसे ठीक कर देगा:

int componentWidth = this.getWidth()-20; // '20' - according width of Jlabel to JFrame 
+2

।GetSize/getBounds आपको स्विंग टाइमर जोड़ने के लिए, झिलमिलाहट से बचने के लिए, केवल फिर से शुरू करने के लिए कॉल करें, आकार समाप्त नहीं होने पर, – mKorbel

+0

क्यों '20'; क्या यह 'FontMetrics' पर आधारित नहीं होना चाहिए? – trashgod

4

FontMetrics का उपयोग करने और TextLayout आप इस उत्पादन प्राप्त कर सकते हैं (कृपया कोड में कोई टिप्पणी पढ़ें) द्वारा

SwingUtilities ऐसा कर सकते हैं सही ढंग से भी

मैं दोनों दिशाओं पर इसके अलावा कुछ पिक्सल जोड़ने के लिए सुझाने

कंटेनर के लिए ComponentListener जोड़ सकते हैं और componentResized घटना पर पुनर्गणना FontMetrics फिर

enter image description here

import java.awt.*; 
import java.awt.font.TextLayout; 
import java.awt.geom.Rectangle2D; 
import javax.swing.*; 

public class ShowFontMetrics extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JLabel lTime; 

    public ShowFontMetrics() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel pane = new JPanel(); 
     pane.setLayout(new FlowLayout()); 
     lTime = new JLabel("88:88"); 
     lTime.setFont(new Font("Helvetica", Font.PLAIN, 88)); 
     FontMetrics fm = lTime.getFontMetrics(lTime.getFont()); 
     TextLayout layout = new TextLayout(lTime.getText(), lTime.getFont(), fm.getFontRenderContext()); 
     Rectangle2D bounds = layout.getBounds(); 
     Dimension d = lTime.getPreferredSize(); 
     d.height = (int) (bounds.getHeight() + 100);// add huge amount of pixels just for for fun 
     d.width = (int) (bounds.getWidth() + 150);// add huge amount of pixels just for for fun 
     lTime.setPreferredSize(d); 
     lTime.setVerticalAlignment(SwingConstants.CENTER); 
     lTime.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     pane.add(lTime); 
     setContentPane(pane); 
    } 

    public static void main(String[] arguments) { 
     ShowFontMetrics frame = new ShowFontMetrics(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

धन्यवाद। लेकिन यह मेरा मतलब नहीं है .. जेएफआरएएम का आकार बदलने के बाद जेएलबल का फ़ॉन्ट बदलना होगा। तो यदि आप जेएफआरएएम को बड़ा/छोटा बनाते हैं - जेएलएबल फ़ॉन्ट को भी बदला जाना है .. – VextoR

+1

एक संबंधित उदाहरण है जो यह [यहां] (http://stackoverflow.com/a/8282330/230513) करता है। – trashgod

+0

मैंने कंपोनेंट लिस्टनर के लिए अपना उत्तर अपडेट किया है (शायद मैं आपका प्रश्न नहीं पढ़ता ...) – mKorbel

4

इस तरह? http://java-sl.com/tip_adapt_label_font_size.html

अद्यतन: अनुरोध

कोड के रूप में

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

public class ResizeLabelFont extends JLabel { 
    public static final int MIN_FONT_SIZE=3; 
    public static final int MAX_FONT_SIZE=240; 
    Graphics g; 

    public ResizeLabelFont(String text) { 
     super(text); 
     init(); 
    } 

    protected void init() { 
     addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       adaptLabelFont(ResizeLabelFont.this); 
      } 
     }); 
    } 

    protected void adaptLabelFont(JLabel l) { 
     if (g==null) { 
      return; 
     } 
     Rectangle r=l.getBounds(); 
     int fontSize=MIN_FONT_SIZE; 
     Font f=l.getFont(); 

     Rectangle r1=new Rectangle(); 
     Rectangle r2=new Rectangle(); 
     while (fontSize<MAX_FONT_SIZE) { 
      r1.setSize(getTextSize(l, f.deriveFont(f.getStyle(), fontSize))); 
      r2.setSize(getTextSize(l, f.deriveFont(f.getStyle(),fontSize+1))); 
      if (r.contains(r1) && ! r.contains(r2)) { 
       break; 
      } 
      fontSize++; 
     } 

     setFont(f.deriveFont(f.getStyle(),fontSize)); 
     repaint(); 
    } 

    private Dimension getTextSize(JLabel l, Font f) { 
     Dimension size=new Dimension(); 
     g.setFont(f); 
     FontMetrics fm=g.getFontMetrics(f); 
     size.width=fm.stringWidth(l.getText()); 
     size.height=fm.getHeight(); 

     return size; 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     this.g=g; 
    } 

    public static void main(String[] args) throws Exception { 
     ResizeLabelFont label=new ResizeLabelFont("Some text"); 
     JFrame frame=new JFrame("Resize label font"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().add(label); 

     frame.setSize(300,300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
+0

+1 के लिए 'deriveFont() 'के लिए @trashgod no +1। – trashgod

+0

मुझे पता है कि यह जवाब पुराना है लेकिन यह केवल एक लिंक है। क्या आप लिंक से आवश्यक जानकारी कॉपी कर सकते हैं। कंटेनर के लिए –

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