Changement JButton dégradé de couleur, mais seulement pour un seul bouton, pas tous
Je veux changer JButton
dégradé de couleur,
j'ai trouvé ceci, http://java2everyone.blogspot.com/2009/01/set-jbutton-gradient-color.html, mais je veux changer de gradient pour un seul bouton, pas de bouton
OriginalL'auteur help | 2011-08-19
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplacer le paintComponent méthode de la
JButton
instance et de la peinture de son Graphiques objet avec l'une des classes suivantes qui mettent en œuvre les Peinture interface:la meilleure solution que j'ai trouvé sur DONC
OriginalL'auteur mre
Un peu d'amélioration au cours mre réponse:
Si une interface graphique a déjà un bouton, il doit y avoir un peu de code qui crée le bouton (JButton b = new JButton("quoi") ). Pour remplacer le bouton par défaut, vous devez créer un JGradientButton à la place (JButton b = new JGradientButton("quoi") et à définir la couleur d'arrière-plan pour ce que vous aimez (b.setBackground(..somecolor...)) . Le reste du code dans l'interface graphique qui gère le bouton doit être laissé inchangé
Par exemple dans NetBeans Gui Builder, sélectionnez le bouton, allez dans les Propriétés de l'onglet "Code", changer "personnaliser le Code de Création'.
OriginalL'auteur luca
TL;DR: il n'est pas possible directement, mais peut être fait avec une solution de contournement comme dans Luca réponse, cependant sa réponse utilise la mauvaise pas de gradient. Les bons sont énumérés ci-dessous.
La façon dont il fonctionne
Dans le Métal LAF il est codé en dur exception. Si le
background
propriété est une sous-classe deUIResource
, c'est ignorée;* et que le bouton est à la place peint avec le (également codé en dur) dégradé à partir de la propriété d'INTERFACE utilisateurButton.gradient
. Sinon, sibackground
n'est pas unUIResource
, que le fond est peint comme-est.*sauf si le bouton est désactivé, auquel cas il n'y a pas de gradient de couleur et la couleur à l'intérieur de la
UIResource
est utilisé pour le fond.Le gradient
En suivant la logique de
MetalButtonUI
, j'ai découvert le gradient utilisé il utilise provient de l'INTERFACE utilisateur de la propriétéButton.gradient
, qui contient leArrayList
:En suivant la logique encore plus loin, je me suis retrouvé dans
MetalUtils.GradientPainter.drawVerticalGradient()
. Cette mise en œuvre interprète les données ci-dessus*:*en supposant que le deuxième flotteur est de 0,0, sinon plus dégradés sont tirés.
Puisque c'est un multi-étape de dégradé, il ne peut être fait avec un simple
GradientPaint
mais peut être fait avec uneLinearGradientPaint
. Cependant, lebackground
établissement accepte uniquement lesColor
. Il ne peut même pas être usurpée/piraté parce que la valeur réelle est finalement donné àGraphics.setColor()
et pasGraphics2D.setPaint()
(même si le Métal est Swing et n'est pas AWT) impasse. La seule solution semble sous-classe JButton tout à fait.OriginalL'auteur Mark Jeronimus