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

उदाहरण कोड (सरलीकृत):

public class PDFPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);

        Graphics2D g2 = (Graphics2D) graphics;
        int scale = 1;   // (simplified this line)

        g2.setColor(getBackground());
        g2.fillRect(0, 0, getWidth(), getHeight());

        try {
            pdfRenderer.renderPageToGraphics(pageNumber, g2, (float) scale, (float) scale);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
2
trinity420 14 जिंदा 2020, 20:57

1 उत्तर

सबसे बढ़िया उत्तर

एक BufferedImage छवि फ़ील्ड का उपयोग करें। इसकी एक विधि createGraphics() है जहां आप आकर्षित कर सकते हैं। बाद में संसाधनों को साफ करने के लिए Graphics.dispose() पर कॉल करें।

फिर paintComponent में छवि की उपलब्धता की जांच करें, इसे प्रदर्शित करने के लिए।

प्रतिपादन भविष्य, स्विंगवर्कर या जो कुछ भी किया जा सकता है। आप सही कह रहे हैं कि paintComponent में कभी भी भारी ऑपरेशन नहीं करना चाहिए क्योंकि इसे बार-बार कहा जा सकता है।

कंस्ट्रक्टर में, या अपने कंट्रोलर में रेंडरिंग को बेहतर तरीके से लॉन्च करें।

    BufferedImage image = new BufferedImage(getWidth(), getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = image.createGraphics();
    try {
        pdfRenderer.renderPageToGraphics(pageNumber, g2, (float) scale, (float) scale);
    } finally {
        g2d.dispose();
    }

प्रारंभ में चौड़ाई और ऊंचाई नहीं भरी जाती है, इसलिए पीडीएफ से चौड़ाई और ऊंचाई का बेहतर उपयोग करें। यह भी नहीं कि एक ग्राफिक्स 2 डी स्केलिंग की अनुमति देता है; आप आसानी से ज़ूमिंग जोड़ सकते हैं।

प्रदान की गई छवि को पारित करने के लिए परमाणु रूप से कैसे संभालना है, यह शायद स्पष्ट है।

3
Joop Eggen 14 जिंदा 2020, 18:23