2011-10-15 28 views
7

मैं, एक विशेष उद्देश्य के लिए कुछ विशेष घटक बनाने के लिए कोशिश कर रहा हूँ कि घटक मैं एक HTML स्ट्रिंग आकर्षित करने की आवश्यकता पर, यहाँ एक नमूना कोड एचटीएमएल प्रारूप को मान्यता नहीं दे रहा है, यह मूर्खतापूर्वक स्ट्रिंग को उतना ही खींचता है जितना कि यह है।स्विंग एचटीएमएल drawstring

क्या यह काम करने का कोई तरीका है?

+3

आप जेएलएबल का उपयोग क्यों नहीं करते? यह एचटीएमएल टैग का समर्थन करता है। –

+0

मेरा घटक सिर्फ एक HTML स्ट्रिंग नहीं खींचता है, वहां कई अन्य ड्राइंग ऑपरेशंस हैं जिन्हें मैं वास्तविक समस्या पर ध्यान केंद्रित करने के लिए नमूना कोड में दिखाना नहीं चाहता था। –

+0

'विशेष' कैसे? 'विशेष रूप से' क्या? इस सवाल के जवाब यह सुझाव देंगे कि कम से कम अधिक जानकारी शामिल करना एक अच्छा विचार है। –

उत्तर

5

मैं एक छोटी और एक साफ रास्ता paintHtmlString अनुकरण करने के लिए मिल गया है; यहाँ कोड है:

public class MyComponent extends JComponent { 

    private JLabel label = null; 

    public MyComponent() { 
     super(); 
    } 

    private JLabel getLabel() { 
     if (label == null) { 
      label = new JLabel(); 
     } 
     return label; 
    } 

    /** 
    * x and y stand for the upper left corner of the label 
    * and not for the baseline coordinates ... 
    */ 
    private void paintHtmlString(Graphics g, String html, int x, int y) { 
     g.translate(x, y); 
     getLabel().setText(html); 
     //the fontMetrics stringWidth and height can be replaced by 
     //getLabel().getPreferredSize() if needed 
     getLabel().paint(g); 
     g.translate(-x, -y); 
    } 

    protected void paintComponent(Graphics g) { 
     //some drawing operations... 
     paintHtmlString(g, "<html><u>some text</u></html>", 10, 10); 
    } 
} 

मदद के लिए हर एक के लिए धन्यवाद, मुझे लगता है कि सराहना करते हैं बहुत ज्यादा।

+0

+1। – trashgod

+0

+1 अच्छा, कभी नहीं पता था कि यह इस तरह से किया जा सकता है :-) –

4

अपनी बेस क्लास के रूप में JLabel का उपयोग करें। Graphics.drawString() केवल ... स्ट्रिंग खींच सकता है।

+0

मेरा घटक सिर्फ एक HTML स्ट्रिंग नहीं खींचता है, वहां कई अन्य ड्राइंग ऑपरेशंस हैं जिन्हें मैं वास्तविक समस्या पर ध्यान केंद्रित करने के लिए नमूना कोड में दिखाना नहीं चाहता था। मुझे पता है कि जेएलएबल और अन्य सभी स्विंग घटक जो पाठ धारण कर रहे हैं, एचटीएमएल प्रारूप का समर्थन करते हैं।
मैं बस सोच रहा हूं कि ग्राफिक्स उदाहरण के माध्यम से HTML ग्रंथों को प्रस्तुत करने का कोई तरीका है या नहीं। –

+0

उपयोगी उत्तर के लिए धन्यवाद। –

6

आपके प्रश्न का उत्तर यह है कि HTML समर्थित नहीं है।

आसान समाधान स्विंग घटकों का उपयोग करना और उन्हें ठीक से बाहर रखना है।

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

+0

उत्तर के लिए बहुत बहुत धन्यवाद, इससे मुझे सही तरीके से सोचने में मदद मिली। –

5

यह लागू करने का तरीका नहीं है।

drawString(String str, int x, int y) केवल इस ग्राफिक्स संदर्भ के वर्तमान फ़ॉन्ट और रंग का उपयोग करके निर्दिष्ट स्ट्रिंग द्वारा दिए गए पाठ को खींचता है।

आप यहां से आपकी समस्या के लिए और अधिक जानकारी प्राप्त कर सकते हैं How to Use HTML in Swing Components

+0

उत्तर के लिए धन्यवाद, इससे मुझे सही तरीके से जाने में मदद मिली। –

2

वहाँ ग्राफिक्स के साथ पेंट करने के लिए, एक JLabel के साथ जाने के लिए HTML रेंडर करने के लिए एक आसान तरीका नहीं है।

private JLabel label; 

public MyComponent() { 
    label = new JLabel("Before Red"); 
    label.setText("<html><u>test</u></html>"); 
    this.add(label); 
} 

public void repaint(Graphics g){ 
    g = label.getGraphics(); 
} 

सबसे आसान तरीका है यह पूरा करने के अपने ग्राफिक्स के लिए एक फ़ॉन्ट स्थापित करने के लिए किया जाएगा:

हालांकि, वहाँ HTML के साथ एक JLabel बनाने और पेंटिंग यह घटक के लिए ग्राफिक्स है द्वारा यह पूरा करने के लिए एक दिलचस्प तरीका है , उदाहरण के लिए:

public void repaint(Graphics g){  
    Font f = new Font("Courier", Font.BOLD, 12); 
    g.setFont(f); 
    g.drawString("Bolded Courier", 5, 15); 
} 
9

जैसा कि अन्य ने टिप्पणी की है, स्विंग घटक HTML 3.2 और मूल शैलियों का समर्थन करते हैं।

paintComponent(Graphics) विधि में है कि क्षमता का लाभ उठाने के लिए कैसे पर जानकारी के लिए, this thread पर LabelRenderTest.java स्रोत देखें।

दृष्टिकोण एक चित्र में लेबल रेंडर करने के लिए है, तो Graphics वस्तु के लिए छवि प्रस्तुत करना है।

+0

मुझे जेएलएबल का उपयोग करके एचटीएमएलस्ट्रिंग को पेंट करने का एक तरीका मिला है, लेकिन एक छवि प्रस्तुत करने की आवश्यकता के बिना (मेरी पोस्ट पर एक नज़र डालें)। मदद के लिए बहुत - बहुत धन्यवाद। –

10

यदि जावा 2 डी का प्रशंसक है; लेकिन स्विंग घटकों और लेआउट में एचटीएमएल से सबसे ज्यादा लाभ उठाने के लिए, मैं आपको @camickr द्वारा सुझाए गए घटक दृष्टिकोण का उपयोग करने के लिए प्रोत्साहित करता हूं। यदि आवश्यक हो, तो आप फ्लाईवेट renderer approach का उपयोग JTable, एट अल में देख सकते हैं, जिसमें ड्राइंग के लिए बार-बार एक घटक का उपयोग किया जाता है। नीचे दिया गया उदाहरण बहुत तकनीक की सरलीकृत रूपरेखा है, केवल रंग और स्थान बदल रहा है।

परिशिष्ट: अद्यतन उदाहरण; CellRendererPane और Make your apps fly: Implement Flyweight to improve performance भी देखें।

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.CellRendererPane; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** @see http://stackoverflow.com/questions/7774960 */ 
public class PaintComponentTest extends JPanel { 

    private static final int N = 8; 
    private static final String s = "<html><big><u>Hello</u></html>"; 
    private JLabel renderer = new JLabel(s); 
    private CellRendererPane crp = new CellRendererPane(); 
    private Dimension dim; 

    public PaintComponentTest() { 
     this.setBackground(Color.black); 
     dim = renderer.getPreferredSize(); 
     this.add(crp); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (int i = 0; i < N; i++) { 
      renderer.setForeground(Color.getHSBColor((float) i/N, 1, 1)); 
      crp.paintComponent(g, renderer, this, 
       i * dim.width, i * dim.height, dim.width, dim.height); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("PaintComponentTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setSize(dim.width * N, dim.height * (N + 1)); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new PaintComponentTest().display(); 
      } 
     }); 
    } 
} 
+0

सहायता के लिए आपको बहुत बहुत धन्यवाद। मुझे CellRendererPane की आवश्यकता के बिना ऐसा करने का एक और तरीका मिला है। (मेरे उत्तर पोस्ट पर एक नज़र डालें)। –

+1

आपका स्वागत है। ['CellRendererPane'] (http://download.oracle.com/javase/7/docs/api/javax/swing/CellRendererPane.html) बफरिंग और सत्यापन के लिए कुछ सुविधाजनक अनुकूलन प्रदान करता है जो अभी तक उपयोगी आगे बढ़ने के लिए साबित हो सकते हैं। – trashgod

+1

मैं इसे ध्यान में रखूंगा, जानकारी के लिए फिर से धन्यवाद। –

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

  • कोई संबंधित समस्या नहीं^_^