Con ridimensionare l'icona intendi dire che la finestra dell'applicazione ridimensionandosi aumenta o diminuisce la dimensione del JButton a cui hai settato l'icona giusto?
Perché una soluzione a questo problema sarebbe imporre una dimensione fissa al JButton, a meno che non sia tua intenzione il lasciarlo ridimensionare a runtime.
Per quanto riguarda estendere la classe Color, io non lo farei, di solito per usare immagini di background o fare in generale "custom painting" sui componenti si ridefinisce il metodo protetto paintComponent(Graphics g) dello stesso componente.
Ho buttato giù qualche riga di codice per fare una prova:
codice:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ProvaRidimensiona extends JFrame
{
public ProvaRidimensiona()
{
super("Test ridimensionamento");
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(new ImageButton("Click","Image.png"));
pack();
setLocationRelativeTo(null);
}
public static void main(String[] a)
{
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new ProvaRidimensiona().setVisible(true);
}
});
}
}
class ImageButton extends JButton
{
private BufferedImage image;
public ImageButton(String text,String imageSource)
{
super(text);
try{
image=ImageIO.read(ClassLoader.getSystemResource(imageSource));
}
catch(IOException e)
{
System.out.print("\nError while reading image");
System.exit(1);
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image,0,0,null);
}
}
Come vedi il metodo paintComponent non fa altro che richiamare quello di base del JButton, e poi ci disegna sopra la tua immagine che hai passato al costruttore.
Se però hai settato del testo al JButton come ho fatto io nell'esempio, il testo sarà coperto dall'immagine, quindi se questo è il caso devi pensare a qualcos'altro (se vuoi continuare su questo tipico approccio,Graphics ha anche metodi come drawString() etc...).
Inoltre il drawImage che ho usato, scritto in questo modo, non fa altro che disegnare tutta la superficie dell'immagine che riesce, a partire dall'angolo in alto a sinistra.
Se il bottone diventa più grande dell'immagine, vedrai il bordo dell'immagine comparire e il resto del bottone sarà "scoperto".
Avendo tu parlato di texture immagino vorrai replicare un'immagine relativamente piccola per coprire tutta la superficie del bottone, in realtà basta un ciclo in cui ripeti il drawImage per tutta la larghezza/altezza del componente, comunque se vuoi in questo esempio del nostro andbin trovi qualcosa di molto simile per un pannello: https://github.com/andbin/java-examp...om-backgrounds