C'è un modo per cambiare il disegno di sfondo predefinito di tutte le istanze di un componente di swing (un JPanel per esempio) per dipingere con uno sfondo a gradiente? O dovrei creare un'estensione di JPanel che dipinga con una sfumatura e poi usarla al posto di JPanel ovunque nella mia app?Sfondo sfumato predefinito del componente di rotazione
risposta
IMHO, sarebbe più semplice creare una sottoclasse del componente Swing e ignorare il metodo paintComponent
per eseguire la sfumatura. E poi, come hai detto, usa questo componente personalizzato per tutta l'applicazione.
Potrebbe essere difficile utilizzare le proprietà dell'interfaccia utente poiché potrebbero non essere coerenti su tutti i LaF.
quello era il mio pensiero iniziale. non ero sicuro se ci fosse un modo più semplice per farlo. soprattutto se volessi applicare il gradiente a più tipi di componenti, avrei bisogno di sottoclasse tutti i componenti. –
@JeffStorey, In tal caso, forse sarebbe meglio sottoclasse 'JComponent'. – Moonbeam
Non sono sicuro di come sarebbe utile per più tipi di componenti. Diciamo che stavo cambiando lo sfondo di un pulsante, come sarebbe la sottoclasse di aiuto di JComponent qui? –
Non è del tutto chiaro quale scopo intendete. Intendevi per classe (quindi tutte le istanze di JPanel seguono il nuovo schema di disegno) oppure intendi tutti i componenti in un contenitore (ad esempio, tutto in Frame)?
Ci sono possibilità di fare ciò a seconda della classe del componente, i punti in cui è possibile agganciare sono il Look and Feel e, in base all'istanza del componente, il metodo paintComponent() o se è necessario sostituire il aspetto standard di un componente esistente in cui non è possibile sovrascrivere il metodo perché non si ha il controllo su di esso, fornendo la propria classe di interfaccia utente (guardare Component.setUI) dopo che il componente è stato creato.
Fatta eccezione per l'approccio di sovrascrittura del colore, non è semplice implementare l'approccio. Per la maggior parte delle applicazioni l'approccio semplice è il migliore :)
Non dovresti farlo solo per lo sfondo JPanel, e quindi rendere non tutti gli altri JPanel non opachi? –
@HovercraftFullOfEels, anche questa è un'altra opzione. Se volessi estenderlo ad altri componenti, penso che avrei comunque bisogno di estendere questi componenti. –
@JeffStorey: forse, ma non necessariamente. Puoi creare i tuoi JPanel tramite un semplice metodo di fabbrica che imposta l'opaco su falso, oppure potresti ricorrere attraverso la GUI impostando tutti gli JPanel non di base non opachi. –