2012-06-22 19 views
7

निम्न उदाहरण में, मैं एक कस्टम JComponent हरे रंग की पृष्ठभूमि पर तैयार किया जा रहा है, लेकिन यह नहीं दिखता है। ऐसा क्यों होता है?कस्टम जेकंपोनेंट में पृष्ठभूमि कैसे काम करें?

public class Test_Background { 

    public static class JEllipse extends JComponent { 

     private final Ellipse2D ellipse; 

     public JEllipse(int width, int height) { 
      ellipse = new Ellipse2D.Double(0, 0, width, height); 

      setOpaque(true); 
      setBackground(Color.GREEN); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension((int) ellipse.getBounds().getMaxX(), 
           (int) ellipse.getBounds().getMaxY()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      ((Graphics2D) g).draw(ellipse); 
     } 
    } 

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

      @Override 
      public void run() { 
       JEllipse e = new JEllipse(400, 300); 

       JFrame f = new JFrame("Background Test"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.add(e); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

उत्तर

12

जेकंपोनेंट अपनी पृष्ठभूमि को पेंट नहीं करता है। आप या तो इसे अपने आप को पेंट कर सकते हैं, या JPanel जो अपनी पृष्ठभूमि

+1

+1 यह सही और संक्षिप्त है, लेकिन सुजान 'Graphics2D.draw()' को कॉल करने से पहले रंग सेट करना भूल गया है। इस प्रकार रंग अप्रत्याशित होगा। और चूंकि वह JComponent अपारदर्शी होने की घोषणा की है, वह करना होगा * * रंग पृष्ठभूमि खुद या एक घटक, JPanel की तरह है, जो ऐसा नहीं करता है से विस्तार। – Enwired

1

रंग मुझे याद है के रूप में यह केवल इस पृष्ठभूमि संपत्ति का समर्थन कर रहा है करता है का उपयोग करें, लेकिन यह वास्तव में आकर्षित नहीं करता है। अपनी खुद की पृष्ठभूमि बनाने के लिए पम g.fillRect (या अगर यह अंडाकार है तो fillEllipse) का उपयोग करें।

1

अपने पेंट() विधि में कई समस्याएं हैं।

  • तुम कभी बुला रहे हैं Graphics.setColor(), तो रंग आप में चित्रकारी कर रहे हैं पूरी तरह से अज्ञात है।
  • आप इस घटक घोषणा की है अपारदर्शी होने, जिसका अर्थ है कि आप का वादा पृष्ठभूमि अपने आप को पेंट करने के लिए कर रहे हैं। आप JComponent के बजाय JPanel से विस्तार कर सकता है, और यह आप के लिए पृष्ठभूमि रंग होगा, केवल अग्रभाग करने के लिए जा

    protected void paintComponent(Graphics g) { 
         super.paintComponent(g); 
         Graphics2D g2 = (Graphics2D) g; 
         g2.setColor(getBackground()); 
         g2.fillRect(0, 0, getWidth(), getHeight()); 
         g2.setColor(getForeground()); 
         g2.draw(ellipse); 
        } 
    

    या,:

आप इस तरह के और अधिक कुछ चाहते हैं

protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(getForeground()); 
     g2.draw(ellipse); 
    } 
+0

मुझे लगता है कि यदि आपको कोई त्रुटि भी है: अगर से 'getX()' और 'Gety()' भरने शुरू करने के लिए सही नहीं है। ये मान शून्य होना चाहिए। –

+0

आप सही हैं। मैं कोड संपादित करूंगा। – Enwired