2012-06-22 12 views
7

En el siguiente ejemplo, tengo un JComponent personalizado dibujado sobre fondo verde, pero no aparece. ¿Por qué pasó esto?¿Cómo hacer que el fondo funcione en JComponent personalizado?

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

Respuesta

12

JComponent no pinta su fondo. Puede pintarlo usted mismo, o usar JPanel que pinta su fondo

+1

+1 Esto es correcto y conciso, pero Suzan también olvidó establecer el color antes de llamar a 'Graphics2D.draw()'. El color será impredecible. Y como ha declarado que JComponent es opaco, debe * pintar el fondo ella misma o extender desde un componente, como JPanel, que lo hace. – Enwired

1

Como recuerdo, solo es compatible con esta propiedad de fondo, pero no dibuja realmente. Pum utiliza g.fillRect (o fillEllipse si esto es elipse) para crear tu propio fondo.

1

Existen varios problemas en el método de pintura().

  • Nunca llama a Graphics.setColor(), por lo que el color que está pintando es completamente desconocido.
  • Has declarado que este componente es opaco, lo que significa que eres con la promesa de pintar el fondo tú mismo.

quieres algo más a esto:

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

O bien, puede extenderse desde JPanel en lugar de JComponent, y se va a pintar el fondo para que, dejando a hacer solamente el primer plano:

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

Creo que también tiene un error: si no es correcto, empiece a llenar desde 'getX()' y 'getY()'. Estos valores deben ser ceros. –

+0

Tiene razón. Editaré el código. – Enwired

Cuestiones relacionadas