2009-05-23 8 views
9

mi rendo conto maggior parte del codice Java per la vernice sovrascritti o paintComponent, la maggior parte di loro non ripristina il vecchio stato di grafica oggetto, dopo che avevano cambiare lo stato della grafica oggetto. Ad esempio, setStroke, setRenderingHint ...la necessità di ripristinare grafica originale Stato Quando la vernice sovrascritti o paintComponent

Mi chiedevo se è una buona pratica ripristinare il vecchio stato dell'oggetto grafico, prima di tornare dal metodo. Per esempio

public void paintComponent(Graphics g) { 
    super.paintComponet(g); 
    Stroke oldStroke = g.getStroke(); 
    g.setStroke(newStroke); 
    // Do drawing operation. 
    g.setStroke(oldStroke); 
} 

Questa è una buona pratica? O è finito fatto?

risposta

15

Non è necessario modificare l'oggetto Graphics inoltrato, piuttosto eseguire tutte le operazioni grafiche su una copia di esso che verrà quindi smaltire. Non ci sarà quindi bisogno di resettare lo stato.

public void paintComponent(Graphics g1) { 
    super.paintComponent(g1); 
    final Graphics2D g = (Graphics2D)g1.create(); 
    try { 
     // ...Whole lotta drawing code... 
    } finally { 
     g.dispose(); 
    } 
} 
+3

Ho intenzione di supportare questa risposta con JavaDoc per JComponent che accetta: http : //docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent%28java.awt.Graphics%29 –

3

Sì, questa è una pratica molto buona da seguire. Non si paga molto in termini di prestazioni (rispetto all'effettiva operazione di disegno) e si risparmia un guaio di dolore se si apportano modifiche insolite al contesto grafico. Non esagerare però - probabilmente non ti devi preoccupare delle impostazioni del colore, ad esempio.

L'alternativa è quella di assumere nulla del contesto grafico e impostare tutte le proprietà necessarie prima di ogni dipinto, nel caso in cui stanno insieme a qualcosa di wonky. Cercare di evitare di creare e smaltire liberamente oggetti grafici per ogni operazione.

proprietà specifiche che si dovrebbe sempre ripristinare se modificata: (perché possono fare cose cattive e hanno conseguenze inaspettate):

  • Transform - perché modifiche a questo sarà impilare uno sopra l'altro e ottenere molto, molto difficile da resettare. Attenzione: questo viene modificato dai metodi translate, shear, scale, ruotare e trasformare di Graphics2D. La modifica delle trasformazioni deve essere utilizzata con ATTENZIONE.
  • Stroke - perché (almeno nella mia configurazione), lasciando questa impostazione predefinita viene eseguito molto più veloce di qualsiasi impostazione anche se equivalente al valore predefinito. Non chiedere - è un risultato delle pipeline grafiche Java2D che accelera il caso predefinito utilizzando l'hardware grafico.
  • Clip: causerà strani bug in cui viene disegnata solo una parte dello schermo.
  • Composito: la maggior parte delle operazioni probabilmente non si aspetta che questo sia qualcosa di strano.

Proprietà di non preoccuparsi:

  • RenderingHints. Queste sono cose che puoi facilmente impostare e ripristinare, e generalmente vuoi lasciarle impostate in un certo modo (antialiasing, ecc.) Per tutto il tempo in cui l'app è in esecuzione. Cambiare RenderingHints interromperà raramente il rendering dei componenti, anche se potrebbe renderlo più brutto.
  • Colore di sfondo e colore della vernice. La maggior parte delle cose le modificherà prima di disegnare comunque.
  • Font: allo stesso modo.
+0

Si dovrebbe trovare che la creazione di un oggetto grafico è estremamente economico. –

+0

Ehm ... sì, corretto.Penso comunque che non sia una buona pratica, perché non si sa mai cos'altro sta usando un oggetto Graphics, e si perdono le impostazioni per RenderingHints, ecc. – BobMcGee

Problemi correlati