2011-11-22 17 views
8

así que tengo este JButtons al que agrego iconos. Los iconos son demasiado grandes al principio, por lo que los cambio de tamaño de antemano, y funcionan bien. Excepto que cuando cambio el tamaño de la ventana, los JButton cambian de tamaño, pero no de Iconos, lo cual es problemático.Icono de JButton de cambio de tamaño automático

¿Hay alguna forma de tener un ícono que solo llene el JButton al que está conectado? Un poco de código para hacerlo más claro:

public JewelClass(){ 

    setBackground (new Color (30,30,30)); 
    addActionListener(this); 
    setLayout(new GridLayout()); 

    ImageIcon icon = new ImageIcon(src/carre.jpg); 
    setIcon (resizeIcon(icon,60,60)); 

} 

resizeIcon siendo una función personal, que lleva un icono, un parámetro de anchura y un parámetro de altura, y regresar un icono de cambiar de tamaño (obviamente). He intentado cambiar el diseño, pero no cambia nada. Intenté obtener el ancho/alto del JButton, pero dado que todavía no existen cuando se agrega el ícono, no funciona.

¿Muchachos tienen alguna idea de cómo superar esto? No tiene que ser un ícono, siempre y cuando mi JButton esté lleno con la imagen que le doy, es increíble :)

¡Gracias!

Respuesta

3

de oscilación puede añadir cualquier JComponent a la otra JComponent, por Image es JLabel la mejor JComponent, entonces por qué no poner el JLabel#setIcon() a la JButton

enter image description hereenter image description here

import java.awt.*; 
import javax.swing.*; 

public class ResizeIconInButton extends JFrame { 
    private static final long serialVersionUID = 1L; 

    public ResizeIconInButton() { 
     JButton myButton = new JButton(); 
     myButton.setLayout(new BorderLayout()); 
     myButton.add(new CustomComponents0()); 
     add(myButton, BorderLayout.CENTER); 
     setPreferredSize(getPreferredSize()); 
     setTitle("Resize Icon In Button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       ResizeIconInButton main = new ResizeIconInButton(); 

      } 
     }; 
     javax.swing.SwingUtilities.invokeLater(r); 
    } 
} 

class CustomComponents0 extends JLabel { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(200, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 200); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 

EDIT:

import java.awt.*; 
import javax.swing.*; 

public class ResizeIconInButton extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg"; 
    private JButton myButton = new JButton(); 
    private JLabel myLabel = new JLabel(); 

    public ResizeIconInButton() { 
     Icon myIcon = new ImageIcon(IMAGE_PATH); 
     myLabel.setIcon(myIcon); 
     myButton.setLayout(new BorderLayout()); 
     myButton.add(myLabel); 
     add(myButton, BorderLayout.CENTER); 
     setPreferredSize(new Dimension(200, 100)); 
     setTitle("Resize Icon In Button"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ResizeIconInButton main = new ResizeIconInButton(); 
      } 
     }); 
    } 
} 
+0

Para un enfoque más simple, cambie a 'int margin = 0; Dimensión dim = this.getParent(). GetSize(); 'sin la necesidad de reemplazar' getMinimumSize() 'y' getPreferredSize() 'ya que el componente principal tiene sus márgenes ya establecidos –

+0

¡Genial! Así que funciona para pintar una forma, pero lo único es, una vez que reemplace 'g.setColor (Color.red); g.fillRect (margen, margen, dim.width - margin * 2, dim.height - margin * 2); ' por ' icono icono = nuevo ImageIcon ("src/triangle.jpg"); icon.paintIcon (this, g, 60, 60); ' , deja de mostrar nada. ¿Tiene alguna idea de por qué es esto? –

+0

@Mikalichov por favor vea mi edición – mKorbel

2

Se podría añadir un componente de escucha a ese botón que al cambiar el tamaño de escalarla en ella

yourButton.addComponentListener(new ComponentListener() { 

     @Override 
     public void componentShown(ComponentEvent e) { 
      // ignore 
     } 

     @Override 
     public void componentResized(ComponentEvent e) { 
      resizeIcon(icon, yourButton.getWidth(), yourButton.getHeight()); 
     } 

     @Override 
     public void componentMoved(ComponentEvent e) { 
      // ignore 
     } 

     @Override 
     public void componentHidden(ComponentEvent e) { 
      // ignore 
     } 
    }); 

Espero que ayude!

3
  1. Anulación paintComponent
  2. Draw the image directamente a Graphics Es objeto

Y en la elaboración de la imagen, proporcionar los argumentos dimensionales getWidth() y getHeight(). Al hacer esto, el redimensionamiento se automatizará. Además, al redimensionar, querrá hacer un anti-aliasing para que la imagen no se pixele demasiado.

Cuestiones relacionadas