2011-11-22 15 views
8

quindi ho questo JButtons a cui aggiungo le icone. Le icone sono troppo grandi inizialmente, quindi le ridimensiono in anticipo e funziona perfettamente. Tranne che quando ridimensiono la finestra, i JButton cambiano dimensione, ma non le icone, il che è problematico.Auto-ridimensionamento Icona JButton

C'è un modo per avere un'icona basta riempire il JButton a cui è collegato? Bit di codice per renderlo più chiaro:

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 essendo una funzione personale, che prende un'icona, un parametro di larghezza e un parametro di altezza, e restituisce un'icona ridimensionata (ovviamente). Ho provato a cambiare il layout, ma non cambia nulla. Ho provato ad ottenere la larghezza/altezza del JButton, ma dal momento che non esistono ancora quando l'Icona viene aggiunta, non funziona.

Avete qualche idea di come superare questo? Non deve essere un'icona, fintanto che il mio JButton è pieno dell'immagine che gli ho dato, è fantastico :)

Grazie!

risposta

3

in Swing è possibile aggiungere qualsiasi JComponent alla un'altra JComponent, per Image è JLabel il miglior JComponent, allora perché non mettere il JLabel#setIcon() al 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

Per un approccio più semplice, passare a 'int margin = 0; Dimension dim = this.getParent(). GetSize(); 'senza la necessità di sovrascrivere' getMinimumSize() 'e' getPreferredSize() 'poiché il componente principale ha già i suoi margini impostati –

+0

Grande! Quindi funziona per dipingere una forma, ma l'unica cosa è, una volta sostituisco 'g.setColor (Color.red); g.fillRect (margine, margine, dim.width - margine * 2, dim.height - margine * 2); ' di ' Icona icona = nuovo ImageIcon ("src/triangle.jpg"); icon.paintIcon (this, g, 60, 60); ' , smette di visualizzare qualsiasi cosa. Hai idea del motivo? –

+0

@Mikalichov si prega di vedere la mia modifica – mKorbel

2

Si potrebbe aggiungere un componente-Listener a quel pulsante che sul ridimensionamento ridimensiona l'immagine in esso

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 
     } 
    }); 

Speranza che aiuta!

3
  1. Override paintComponent
  2. Draw the image direttamente ad esso è Graphics oggetto

E quando disegnare l'immagine, fornire gli argomenti dimensionali getWidth() e getHeight(). In questo modo, il ridimensionamento sarà automatizzato. Inoltre, durante il ridimensionamento, ti consigliamo di fare un po 'di anti-aliasing in modo che l'immagine non diventi troppo pixelata.