2012-04-04 10 views

उत्तर

6

दो उदाहरण

इस रंग से उत्पादन BufferedImage होगा, AWT अवयव उपयोग विधि paint() के लिए, स्विंग JComponents के लिए वहाँ paintComponet()

है

इसके अलावा, एक टिप्पणी में लिंक किए गए कोड से:

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/6296381/418556) जहां (spec से परे) मैं पाठ के आकार पर एक सीमा लागू करता हूं। –

+0

कृपया मेरे संपादन को क्षमा करें। अगर आपको नहीं लगता कि यह आपके उत्तर के लिए उपयुक्त है, तो इसे वापस रोल करें। लेकिन एक तस्वीर हजारों शब्दों को चित्रित करती है, या इस मामले में 'बिल्ली'। ;) –

+0

* "एडब्ल्यूटी घटक के लिए .." * .. एक टाइम मशीन। उन्हें क्यों उल्लेख करें? –

0

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

+0

सामान्य रूप में काम करने के लिए है और मैं इसे अच्छा देखने की जरूरत है बहुत संभावना नहीं है। मुझे नहीं लगता कि एमएस या Google उनके मानचित्र में क्या करता है। –

2

यह सुनिश्चित नहीं है कि आप अब टेक्स्ट को कैसे चित्रित कर रहे हैं, लेकिन एक तरीका यह है कि आप इसे एक ऐसा कर सकते हैं जिसे बुफेर्ड इमेज का उपयोग ओवरले के रूप में किया जा सकता है, जिसे आप चित्रित कर रहे हैं।

  1. स्ट्रिंग और फ़ॉन्ट के आयामों का उपयोग करके BufferedImage बनाएं जिसे आप आकर्षित करना चाहते हैं (इसके लिए FontMetrics क्लास देखें)।
  2. बुफेर्ड इमेज पारदर्शिता के साथ भरें।
  3. अपनी स्ट्रिंग को BufferedImage पर जो भी रंग आप चाहते हैं उसे खींचें।
  4. बुफर्ड इमेज में प्रत्येक पिक्सेल पर इटरेट करें और देखें कि यह आपके टेक्स्ट के रंग के पिक्सेल से कितना दूर है। यदि यह एक निश्चित दूरी के भीतर है, तो उस पिक्सेल को काला बनाएं, और शायद आपके पाठ के रंग से दूर होने पर अधिक पारदर्शी हो। बेशक, यदि पिक्सेल पहले से ही आपके टेक्स्ट रंग के समान रंग है, तो इसे अनदेखा करें।
  5. ब्रफर्ड इमेज को जो कुछ भी आप चित्रित कर रहे हैं उसे खीचें।

संपादित

वहाँ पुस्तकालयों वहाँ कि पहले से ही ऐसा करते हैं हो सकता है, लेकिन अगर मैं खरोंच से यह कोड करने के लिए किया था, यह कैसे मैं इसे करने की कोशिश करेंगे।

+0

अच्छा विचार, निश्चित रूप से एक कोशिश के लायक है। धन्यवाद। –

0

यहाँ एक hacky उदाहरण है। यह दूसरों के रूप में परिष्कृत नहीं है, लेकिन यह समझना आसान है, और यह जेएलएबल की तरह व्यवहार करता है।

public class OutlineLabel extends JLabel { 

    private Color outlineColor = Color.WHITE; 
    private boolean isPaintingOutline = false; 
    private boolean forceTransparent = false; 

    public OutlineLabel() { 
     super(); 
    } 

    public OutlineLabel(String text) { 
     super(text); 
    } 

    public OutlineLabel(String text, int horizontalAlignment) { 
     super(text, horizontalAlignment); 
    } 

    public Color getOutlineColor() { 
     return outlineColor; 
    } 

    public void setOutlineColor(Color outlineColor) { 
     this.outlineColor = outlineColor; 
     this.invalidate(); 
    } 

    @Override 
    public Color getForeground() { 
     if (isPaintingOutline) { 
      return outlineColor; 
     } else { 
      return super.getForeground(); 
     } 
    } 

    @Override 
    public boolean isOpaque() { 
     if (forceTransparent) { 
      return false; 
     } else { 
      return super.isOpaque(); 
     } 
    } 

    @Override 
    public void paint(Graphics g) { 

     String text = getText(); 
     if (text == null || text.length() == 0) { 
      super.paint(g); 
      return; 
     } 

     // 1 2 3 
     // 8 9 4 
     // 7 6 5 

     if (isOpaque()) 
      super.paint(g); 

     forceTransparent = true; 
     isPaintingOutline = true; 
     g.translate(-1, -1); super.paint(g); // 1 
     g.translate(1, 0); super.paint(g); // 2 
     g.translate(1, 0); super.paint(g); // 3 
     g.translate(0, 1); super.paint(g); // 4 
     g.translate(0, 1); super.paint(g); // 5 
     g.translate(-1, 0); super.paint(g); // 6 
     g.translate(-1, 0); super.paint(g); // 7 
     g.translate(0, -1); super.paint(g); // 8 
     g.translate(1, 0); // 9 
     isPaintingOutline = false; 

     super.paint(g); 
     forceTransparent = false; 

    } 

    public static void main(String[] args) { 
     JFrame w = new JFrame(); 
     w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     OutlineLabel label = new OutlineLabel("Test", OutlineLabel.CENTER); 
     label.setOpaque(true); 
     w.setContentPane(new JPanel(new BorderLayout())); 
     w.add(label, BorderLayout.CENTER); 
     w.pack(); 
     w.setVisible(true); 
    } 
} 
0

निम्नलिखित का प्रयास करें:

public void paintTextWithOutline(Graphics g) { 
    String text = "some text"; 

    Color outlineColor = Color.white; 
    Color fillColor = Color.black; 
    BasicStroke outlineStroke = new BasicStroke(2.0f); 

    if (g instanceof Graphics2D) { 
     Graphics2D g2 = (Graphics2D) g; 

     // remember original settings 
     Color originalColor = g2.getColor(); 
     Stroke originalStroke = g2.getStroke(); 
     RenderingHints originalHints = g2.getRenderingHints(); 


     // create a glyph vector from your text 
     GlyphVector glyphVector = getFont().createGlyphVector(g2.getFontRenderContext(), text); 
     // get the shape object 
     Shape textShape = glyphVector.getOutline(); 

     // activate anti aliasing for text rendering (if you want it to look nice) 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setRenderingHint(RenderingHints.KEY_RENDERING, 
       RenderingHints.VALUE_RENDER_QUALITY); 

     g2.setColor(outlineColor); 
     g2.setStroke(outlineStroke); 
     g2.draw(textShape); // draw outline 

     g2.setColor(fillColor); 
     g2.fill(textShape); // fill the shape 

     // reset to original settings after painting 
     g2.setColor(originalColor); 
     g2.setStroke(originalStroke); 
     g2.setRenderingHints(originalHints); 
    } 
} 
संबंधित मुद्दे