2012-06-22 5 views
7

Nell'esempio seguente, ho un JComponent personalizzato disegnato su sfondo verde, ma non viene visualizzato. Perché succede?Come far funzionare lo sfondo in JComponent personalizzato?

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

risposta

12

JComponent non dipinge il suo sfondo. Puoi dipingerlo da solo o usare JPanel che dipinge il suo sfondo

+1

+1 Questo è corretto e conciso, ma Suzan ha anche dimenticato di impostare il colore prima di chiamare 'Graphics2D.draw()'. Il colore sarà quindi imprevedibile. E poiché ha dichiarato che JComponent è opaco, deve * dipingere lo sfondo da sola o estendersi da un componente, come JPanel, che lo fa. – Enwired

1

Come ricordo, supporta solo questa proprietà backgroun, ma in realtà non la disegna. Pum usa g.fillRect (o fillEllipse se questa è un'ellisse) per creare il tuo sfondo.

1

Ci sono diversi problemi nel metodo paint().

  • Non si chiama mai Graphics.setColor(), quindi il colore che si sta dipingendo è completamente sconosciuto.
  • Hai dichiarato che questo componente è opaco, il che significa che sei promettendo per dipingere lo sfondo da solo.

volete qualcosa di più simile a questo:

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

Oppure, si potrebbe estendersi da JPanel invece di JComponent, e sarà dipingere il fondo per voi, lasciandovi a fare solo il primo piano:

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

Penso che tu abbia anche un errore: se non è corretto iniziare a riempire da 'getX()' e 'getY()'. Questi valori dovrebbero essere zeri. –

+0

Sei corretto. Modificherò il codice. – Enwired