दिलचस्प पोस्ट
युग में डेट प्रारूप को परिवर्तित करें एंड्रॉइड में डेटा लगातार बना रहा है ब्राउज़र बैक बटन इवेंट का पता लगाने के लिए – क्रॉस ब्राउज़र मैं ओपनजीएल ईएस 1.1 में एक बड़े मॉडल के प्रतिपादन को कैसे अनुकूलित कर सकता हूं? फोनगैप – यूआरएल से डिवाइस फोटो गैलरी में छवि सहेजें कैसे एक वैश्विक चर परिभाषित करने के लिए कि मेरे आवेदन में कहीं भी पहुँचा जा सकता है? अन्य सभी नियंत्रणों के ऊपर ओवरले नियंत्रण कैसे करें? SQLite में 2 तिथियों के बीच अंतर बुनियादी HTML दृश्य प्रस्तुत करना है? अतुल्यकालिक बनाम गैर-अवरोधन मैं कैसे परीक्षण कर सकता हूँ यदि एक चर एक संख्या में है Bash? क्या मैं जावास्क्रिप्ट में कंसोल ऑब्जेक्ट का विस्तार कर सकता हूं? SQL सर्वर में अग्रणी शून्य ट्रिम करने के लिए बेहतर तकनीक? मैं सी या सी ++ में 128 बिट पूर्णांक कैसे जोड़ और घटाना कर सकता हूं अगर मेरा कंपाइलर उन्हें समर्थन नहीं करता है? डबल प्रस्तुत करने का मुद्दा सुलझाना

बफर्ड इमेज के एक घटक को आकर्षित करना भ्रष्टाचार का कारण बताता है

मैं यहाँ वर्णित JScrollNavigator घटक का उपयोग कर रहा हूं, ताकि एक बड़े "कैनवास की तरह" सीएडी घटक पर एक नेविगेशन खिड़की प्रदान कर JScrollPane जो JScrollPane एक JScrollPane एम्बेड किया है।

मैंने JScrollNavigator को उपयोगकर्ता के लिए कुछ अतिरिक्त संदर्भ प्रदान करने के लिए कैनवास की एक थंबनेल छवि को आकर्षित करने के लिए अनुकूलित करने का प्रयास किया है। हालांकि, ऐसा करने की कार्रवाई के कारण मेरे आवेदन की मुख्य फ़्रेम का प्रतिरूप दूषित हो जाता है। विशेष रूप से, यह व्यूपोर्ट घटक पर कॉलिंग paint(Graphics) की कार्रवाई है (अर्थात मेरा मुख्य कैनवास), BufferedImage द्वारा बनाए गए Graphics ऑब्जेक्ट में गुजर रहा है जो बाद के प्रदर्शन भ्रष्टाचार का कारण बनता है; अगर मैं इस रेखा से बाहर टिप्पणी करता हूँ तो सबकुछ ठीक काम करता है।

नीचे JScrollNavigator की ओवरराइड JScrollNavigator :

 @Override protected void paintComponent(Graphics g) { Component view = jScrollPane.getViewport().getView(); BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); // Paint JScrollPane view to off-screen image and then scale. // It is this action that causes the display corruption! view.paint(g2d); g2d.drawImage(img, 0, 0, null); Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0); super.paintComponent(g); g.drawImage(scaled, 0, 0, null); } 

क्या किसी को भ्रष्टाचार के कारण के रूप में कोई सुझाव है? मुझे लगता होगा कि एक ऑफस्क्रीन छवि को पेंटिंग मौजूदा पेंट आपरेशनों पर कोई प्रभाव नहीं पड़ेगी।

संपादित करें

कुछ अतिरिक्त विवरण प्रदान करने के लिए: JScrollNavigator के बाईं ओर एक उप-पैनल JSplitPane । नेविगेटर के साथ जुड़े JScrollPane दाईं ओर है। "भ्रष्टाचार" के कारण फाड़नेवाला अब रेंडर नहीं होता है और स्क्रॉलबार को दिखाई नहीं देता (वे सफेद दिखाई देते हैं)। अगर मैं JMenu आकार JMenu , तो JMenu अनुभाग भी सफेद हो जाता है अगर मैं नेविगेटर का उपयोग करने या स्क्रॉलबारों के साथ इंटरैक्ट करने का प्रयास करता हूं, तो वे दृश्यमान हो जाते हैं, लेकिन फाड़नेवाला सफेद रहता है ऐसा लगता है कि विभिन्न घटकों के अपारदर्शी सेटिंग्स एक ऑफस्क्रीन छवि को व्यूपोर्ट दृश्य के प्रतिपादन से प्रभावित हुए हैं।

इसके अलावा, अगर मैं JScrollNavigator पूरी तरह से अलग JDialog में दिखाई देता है, तो सब कुछ ठीक से काम करता है

2 संपादित करें

मैं निम्न करके लगातार समस्या को पुन: उत्पन्न कर सकता हूं:

JMenuBar एक JMenuBar जोड़ें:

 JMenuBar bar = new JMenuBar(); bar.add(new JMenu("File")); mFrame.setJMenuBar(bar); 

JScrollNavigator की main() विधि में प्रतिस्थापित:

 jsp.setViewportView(textArea); 

… साथ में:

 jsp.setViewportView(new JPanel() { { setBackground(Color.GREEN); setBorder(BorderFactory.createLineBorder(Color.BLACK, 5)); } }); 

सुनिश्चित करें कि JScrollNavigator एक अलग JDialog रूप में प्रदर्शित होने के बजाय, mFrame भीतर एक पैनल के रूप में एम्बेडेड है:

 mFrame.add(jsp, BorderLayout.CENTER); mFrame.add(nav, BorderLayout.NORTH); 

अब जब आवेदन JMenuBar चलाता है तो अब दिखाई नहीं दे रहा है ; BufferedImage.createGraphics() द्वारा दिए गए Graphics2D को देखने के चित्र को चित्रित करने के कार्य (यानी मोटी काली सीमा के साथ हरे रंग के JPanel BufferedImage.createGraphics() वास्तव में BufferedImage.createGraphics() होता है, संभवतः जेफ्रेम के शीर्ष-बाएं कोने से, संभवतः अन्य घटकों को अस्पष्ट कर रहा है। ऐसा केवल तभी होता है जब व्यूपोर्ट व्यू के रूप में एक JPanel उपयोग किया जाता है, और अन्य घटक जैसे कि JTextArea , JTable आदि नहीं।

3 संपादित करें

ऐसा लगता है कि इस व्यक्ति को एक ही समस्या थी (कोई समाधान पोस्ट नहीं हुआ): http://www.javaworld.com/community/node/2894/

4 संपादित करें

यहां main और paintComponent तरीकों के रूप में दोहराया जाने योग्य त्रुटि के रूप में संपादित करें 2 में वर्णित है:

 public static void main(String[] args) { JScrollPane jsp = new JScrollPane(); jsp.setViewportView(new JPanel() { { setBackground(Color.GREEN); setBorder(BorderFactory.createLineBorder(Color.BLACK, 5)); } }); JScrollNavigator nav = new JScrollNavigator(); nav.setJScrollPane(jsp); JFrame mFrame = new JFrame(); JMenuBar bar = new JMenuBar(); bar.add(new JMenu("File")); mFrame.setJMenuBar(bar); mFrame.setTitle("JScrollNavigator Test"); mFrame.setSize(800, 600); mFrame.setLayout(new GridLayout(1, 2)); mFrame.add(jsp); mFrame.add(nav); Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); mFrame.setLocation((screenDim.width - mFrame.getSize().width) / 2, (screenDim.height - mFrame.getSize().height) / 2); mFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mFrame.setVisible(true); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Component view = jScrollPane.getViewport().getView(); if (img == null) { GraphicsConfiguration gfConf = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB); } Graphics2D g2d = img.createGraphics(); view.paint(g2d); Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0); g.drawImage(scaled, 0, 0, null); } 

5 संपादित करें

ऐसा लगता है कि दूसरों को सटीक समस्या बनाने में परेशानी हो रही है मैं लोगों को यहां चिपकाने वाला कोड चलाने के लिए कहूंगा। जब मैं पहली बार इस उदाहरण को चलाता हूं तो मैं निम्नलिखित को देखता हूं:

दूषित छवि 1

JScrollNavigator या JMenuBar न तो चित्रित किया गया है; ये फ़्रेम क्षेत्र पारदर्शी हैं I

आकार बदलने के बाद मैं निम्नलिखित देखता हूं:

दूषित छवि 2

JMenuBar को अभी भी चित्रित नहीं किया गया है और ऐसा प्रतीत होता है कि JMenuBar (0,0) (जहां JMenuBar होना चाहिए) पर दिया गया कुछ बिंदु पर था। view.paint कॉल इस का सीधा कारण है।

Solutions Collecting From Web of "बफर्ड इमेज के एक घटक को आकर्षित करना भ्रष्टाचार का कारण बताता है"

सारांश: मूल JScrollNavigator एक आसन्न JScrollPane में घटक के एक छोटा थंबनेल पर एक सुविधाजनक हरी NavBox रेंडर करने के लिए स्विंग opacity संपत्ति का उपयोग करता है। क्योंकि यह JPanel तक फैली हुई है, (साझा) यूआई के प्रतिनिधि स्क्रैबल घटक के साथ opacity विरोध का उपयोग करते हैं उपर्युक्त 5 संपादित करें में दी गयी छवियां, संबंधित रेंडरिंग आर्टिफैक्ट को दर्शाती हैं, यहां भी दिखाया गया है । यह समाधान है कि NavBox , JScrollNavigator और स्क्रॉल करने वाला घटक JScrollNavigator बढ़ाए, जैसा कि नीचे दिए गए दूसरे परिशिष्ट में सुझाया गया है। प्रत्येक घटक तब व्यक्तिगत रूप से अपनी संपत्तियों को प्रबंधित कर सकता है।

यहां छवि विवरण दर्ज करें

मेरे कोड , मैक ओएस एक्स, जावा 1.6 पर पोस्ट के रूप में मुझे आपके कोड के साथ असामान्य रेंडरिंग आर्टिफैक्ट दिखाई नहीं देता I क्षमा करें, मुझे कोई भी स्पष्ट पोर्टेबिलिटी उल्लंघन नहीं दिखाई देता है।

छवि एक

कुछ शायद अप्रासंगिक, लेकिन शायद उपयोगी, टिप्पणियां।

  • भले ही आप setSize() उपयोग करते हैं, इस मामले में उचित रूप से, आप अभी भी संलग्न Window को pack() करना चाहिए pack()

     f.pack(); f.setSize(300, 200); 
  • सुविधा के लिए, घटक को सामग्री फलक में आगे add()

     f.add(nav, BorderLayout.WEST); 
  • StringBuilder को StringBuilder को प्राथमिकता दें

  • ComponentAdapter के स्थान पर ComponentAdapter पर विचार करें

परिशिष्ट: जैसा कि मैंने सुझाव दिया है , मुझे नीचे दिखाए गए अनुसार getScaledInstance() बजाय RenderingHints का उपयोग करते हुए कुछ अधिक लचीला परिणाम मिल गए हैं कुछ आइकन जोड़ना छवियों और पाठ पर असर प्रभाव देखने में आसान बनाता है

छवि दो

 editPane.insertIcon(UIManager.getIcon("OptionPane.errorIcon")); editPane.insertIcon(UIManager.getIcon("OptionPane.warningIcon")); ... @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Component view = jScrollPane.getViewport().getView(); BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D off = img.createGraphics(); off.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); off.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); view.paint(off); Graphics2D on = (Graphics2D)g; on.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); on.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); on.drawImage(img, 0, 0, getWidth(), getHeight(), null); } 

पूरक विकल्प: ऐसा लगता है कि JPanel यूआई प्रतिनिधि सहकारी नहीं है। एक कामकाज JComponent का विस्तार करना है ताकि आप अस्पष्टता को नियंत्रित कर सकें। backgroundColor का प्रबंधन करने के लिए यह केवल थोड़ा और काम है NavBox और JScrollNavigator भी एक समान उपचार के लिए उम्मीदवार हैं।

यहां छवि विवरण दर्ज करें

 jsp.setViewportView(new JComponent() { { setBackground(Color.red); setBorder(BorderFactory.createLineBorder(Color.BLACK, 16)); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); } @Override public Dimension getPreferredSize() { return new Dimension(300, 300); } }); 

मुझे भी यकीन नहीं है कि भ्रष्टाचार से तुम्हारा क्या मतलब है, लेकिन मैंने देखा कि यदि आप इमेज को निर्दिष्ट करते हैं तो resampled छवि बहुत अच्छी है। Resigning संकेत के रूप में SCALE_SMOOTH:

 Image scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH); 

हो सकता है कि आप यही चाहते हैं …

मैं आपकी समस्या को पुन: उत्पन्न करने में सक्षम था और आपको अपना परिणाम ढूंढने में सफल रहा। समस्या यह है कि छवि को फिर से दोहराए जाने से छवि का चित्र पूरा नहीं हुआ था, इसलिए छवि के केवल कुछ भाग चित्रित किए जा रहे थे। इसे ठीक करने के लिए, इस फ़ील्ड को अपने JScrollNavigator वर्ग में जोड़ें (एक लॉक के रूप में):

 /** Lock to prevent trying to repaint too many times */ private boolean blockRepaint = false; 

जब हम घटक को दोबारा रंगते हैं, तो यह लॉक सक्रिय हो जाएगा। यह तब तक जारी नहीं किया जाएगा जब तक कि हम पैनल को सफलतापूर्वक पेंट करने में सक्षम न हों – फिर एक और पेंट क्रियान्वित किया जा सकता है।

लॉक द्वारा पालन करने के लिए पेंट ImageObserver को बदला जाना चाहिए और अपने नेविगेशन पैनल को चित्रित करते समय एक ImageObserver उपयोग करना ImageObserver

 @Override protected void paintComponent(final Graphics g) { super.paintComponent(g); if(!blockRepaint){ final Component view = (Component)jScrollPane.getViewport().getView(); BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Paint JScrollPane view to off-screen image and then scale. // It is this action that causes the display corruption! view.paint(g2d); ImageObserver io = new ImageObserver() { @Override public boolean imageUpdate(Image img, int infoflags, int x, int y,int width, int height) { boolean result = true; g.drawImage(img, 0, 0, null); if((infoflags & ImageObserver.FRAMEBITS) == ImageObserver.FRAMEBITS){ blockRepaint = false; result = false; } return result; } }; Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0); blockRepaint = g.drawImage(scaled, 0, 0, io); } }