2012-06-22 33 views
7

Aşağıdaki örnekte, yeşil arka plan üzerinde çizilmiş bir özel JComponent sahibiz, ancak görünmüyor. Bu neden oluyor?Özel JComponent'de arka plan çalışması nasıl yapılır?

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); 
      } 
     }); 
    } 
} 

cevap

12

JComponent arka planını boyamaz. Kendinizi boyayabilir ya da arka planını boyayan JPanel'i kullanabilirsiniz.

+1

+1 Bu doğru ve özlü, ancak Suzan, 'Graphics2D.draw()' ifadesini çağırmadan önce rengi ayarlamayı da unuttu. Bu nedenle renk tahmin edilemez olacaktır. Ve JComponent'in opak olacağını ilan ettiği için, * arka planını kendisi boyamalı ya da JPanel gibi bir parçadan uzanmalıdır. – Enwired

1

Hatırladığım kadarıyla, bu yalnızca bu özellik özelliğini destekliyor, ancak aslında çizmiyor. Pum, kendi arka planınızı oluşturmak için g.fillRect'i (veya bu elipsseElliplip'i) kullanın.

1

Paint() yönteminizde birçok sorun var.

  • Hiçbir zaman Graphics.setColor() numaralı telefonu aramazsınız, böylece boyadığınız renk tamamen bilinmemektedir.
  • Bu bileşenin opak olacağını bildirdiniz, yani arka planı kendiniz boyamak için vaat ediyorsunuz demektir. yerine JComponent ait Jpanel uzanabilir ve sadece ön plan yapmak size bırakarak, sizin için arka plan boya olacaktır,

    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); 
        } 
    

    Veya:

Böyle daha istediğini

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

Bende bir hata olduğunu düşünüyorum: Eğer getX() 've' getY() 'ile doldurmaya başlamak doğru değilse. Bu değerler sıfır olmalıdır. –

+0

Siz haklısınız. Kodu ben düzenleyeceğim. – Enwired

İlgili konular