2013-04-30 3 views
4

J'ai un JButton sur lequel j'ai défini une icône personnalisée. Maintenant, je veux qu'il affiche une autre icône en plus de celle qui est déjà affichée quand je fais glisser le curseur de la souris dessus mais je n'arrive pas à comprendre comment le faire car si j'utilise button.setIcon(icon); cela remplacera l'icône qui est déjà affichée. Comment est-ce que je ferais ceci d'une manière aussi facile comme possible?Définition de plusieurs icônes sur JButton

Répondre

0

Une façon de le faire est:

Créer une icône que vous voulez voir lorsque le pointeur est plané au-dessus du bouton par un outil de retouche d'image. Et définissez cette image une fois que l'événement mousehover se produit.

p.s. utilisez n'importe quel outil d'édition de pic et vous pouvez facilement créer une image de superposition.

J'ai également vu maintenant qu'il existe un concept d'icône de survol dans la classe AbsractButton. Vous pouvez l'utiliser aussi.

+0

* image une fois l'événement mousehover se produit. "* Certainement *** pas *** la façon de le faire. –

+0

J'ai réalisé différentes façons de le faire maintenant. : P Mais je ne sais pas pourquoi cela ne peut pas être fait. Pas le meilleur moyen, mais l'un des moyens .. – LPD

+2

Vous pouvez frapper un mur vers le bas en y enfonçant la tête à plusieurs reprises. C'est *** possible, *** mais je ne le recommanderais pas. –

1

Créez une deuxième version de l'icône de ce bouton qui contient la superposition. Sur la souris, passez à l'image avec la superposition.

Une autre approche pourrait être de combiner l'icône avec sa superposition à une nouvelle icône en mémoire et de le placer comme une icône sur le bouton. Cela peut être une bonne approche si vos icônes changent fréquemment. Si ce n'est pas le cas, j'utiliserais certainement la première approche.

+0

mais alors je devrais avoir plus d'images que nécessaire –

+1

non vous ne le feriez pas. Ici, vous n'aurez besoin que de deux images. Une avec superposition et une autre image normale que vous voulez montrer autrement. C'est ce que j'ai dit dans ma réponse ci-dessous. – LPD

+0

@LPD oui je le ferais parce que j'ai deux 'JButton' qui ont des arrière-plans différents et je veux que la deuxième icône apparaisse lorsque je passe la souris sur les deux donc je devrais avoir 4 images au lieu de 3 –

4

J'ai un JButton sur lequel j'ai défini une icône personnalisée. Maintenant, je veux afficher une autre icône en plus de celle qui est déjà affichée quand je faites glisser mon curseur de la souris dessus mais je ne peux pas comprendre comment le faire parce que si j'utilise button.setIcon (icon); il remplacera l'icône déjà affichée. Comment puis-je faire cela dans un comme un moyen facile possible

  • Je pense que c'est à propos JButton.setRolloverIcon(myIcon);

DButton a mis en œuvre ces méthodes API

JButton.setIcon(myIcon); 
JButton.setRolloverIcon(myIcon); 
JButton.setPressedIcon(myIcon); 
JButton.setDisabledIcon(myIcon); 
3

Si vos icônes sont déjà transparents, vous pouvez facilement mettre en œuvre votre propre Icon de combiner les deux -

public class CombineIcon implements Icon { 
    private Icon top; 
    private Icon bottom; 

    public CombineIcon(Icon top, Icon bottom) { 
     this.top = top; 
     this.bottom = bottom; 
    } 

    public int getIconHeight() { 
     return Math.max(top.getIconHeight(), bottom.getIconHeight()); 
    } 

    public int getIconWidth() { 
     return Math.max(top.getIconWidth(), bottom.getIconWidth()); 
    } 

    public void paintIcon(Component c, Graphics g, int x, int y) { 
     bottom.paintIcon(c, g, x, y); 
     top.paintIcon(c, g, x, y); 
    } 
} 

Vous utilisez setRolloverIcon(icon) pour spécifier l'icône que vous souhaitez afficher lorsque la souris est sur le bouton.

1

Je trouve cela assez facile.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

class CombinedIconButton { 

    public static BufferedImage getCombinedImage(BufferedImage i1, BufferedImage i2) { 
     if (i1.getHeight() != i2.getHeight() 
       || i1.getWidth() != i2.getWidth()) { 
      throw new IllegalArgumentException("Images are not the same size!"); 
     } 
     BufferedImage bi = new BufferedImage(
       i1.getHeight(), 
       i1.getWidth(), 
       BufferedImage.TYPE_INT_ARGB); 
     Graphics g = bi.getGraphics(); 
     g.drawImage(i1,0,0,null); 
     g.drawImage(i2,0,0,null); 
     g.dispose(); 

     return bi; 
    } 

    public static void main(String[] args) throws Exception { 
     URL url1 = new URL("http://i.stack.imgur.com/gJmeJ.png"); // blue circle 
     URL url2 = new URL("http://i.stack.imgur.com/5v2TX.png"); // red triangle 
     final BufferedImage bi1 = ImageIO.read(url1); 
     final BufferedImage bi2 = ImageIO.read(url2); 
     final BufferedImage biC = getCombinedImage(bi1,bi2); 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout()); 

       JToggleButton b = new JToggleButton(); 
       b.setIcon(new ImageIcon(bi1)); 
       b.setRolloverIcon(new ImageIcon(biC)); 
       b.setSelectedIcon(new ImageIcon(bi2)); 

       gui.add(b); 

       JOptionPane.showMessageDialog(null, gui); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
} 

Images empruntées à this answer.

Questions connexes