Cómo agrego una imagen a un JButton

Estoy tratando de agregar una imagen a un JButton y no estoy seguro de lo que me falta. Cuando ejecuto el siguiente código, el botón se ve exactamente igual que si lo hubiera creado sin ningún atributo de imagen. Water.bmp está en la raíz de la carpeta de mi proyecto.

ImageIcon water = new ImageIcon("water.bmp"); JButton button = new JButton(water); frame.add(button); 

Creo que tu problema está en la ubicación de la imagen. Debe colocarlo en su fuente y luego usarlo así:

  JButton button = new JButton(); try { Image img = ImageIO.read(getClass().getResource("resources/water.bmp")); button.setIcon(new ImageIcon(img)); } catch (Exception ex) { System.out.println(ex); } 

En este ejemplo, se supone que la imagen está en la carpeta src / resources /.

@Rogach

y puede agregar:

 // to remote the spacing between the image and button's borders button.setMargin(new Insets(0, 0, 0, 0)); // to add a different background button.setBackground( ... ); // to remove the border button.setBorder(null); 

Parece un problema de ubicación porque ese código está perfectamente bien para agregar el ícono.

Como no conozco su estructura de carpetas, sugiero agregar una simple verificación:

 File imageCheck = new File("water.bmp"); if(imageCheck.exists()) System.out.println("Image file found!") else System.out.println("Image file not found!"); 

De esta forma, si alguna vez te equivocaste en tu ruta, te avisará en lugar de mostrar nada. Se debe lanzar una excepción si el archivo no existe, aunque.

Solo hice una cosa y funcionó para mí … revisa tu código aquí.

 setResizable(false); 

si es falso, lo hará verdadero y funcionará bien … Espero que haya ayudado …

 public class ImageButton extends JButton { protected ImageButton(){ } @Override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; Image img = Toolkit.getDefaultToolkit().getImage("water.bmp"); g2.drawImage(img, 45, 35, this); g2.finalize(); } } 

O usa este código

 class MyButton extends JButton { Image image; ImageObserver imageObserver; MyButtonl(String filename) { super(); ImageIcon icon = new ImageIcon(filename); image = icon.getImage(); imageObserver = icon.getImageObserver(); } public void paint( Graphics g ) { super.paint( g ); g.drawImage(image, 0 , 0 , getWidth() , getHeight() , imageObserver); } } 
 //paste required image on C disk JButton button = new JButton(new ImageIcon("C:water.bmp"); 

Este código funciona para mí:

  BufferedImage image = null; try { URL file = getClass().getResource("water.bmp"); image = ImageIO.read(file); } catch (IOException ioex) { System.err.println("load error: " + ioex.getMessage()); } ImageIcon icon = new ImageIcon(image); JButton quitButton = new JButton(icon); 

Pones tu imagen en la carpeta de recursos y utilizas el siguiente código:

 JButton btn = new JButton(""); btn.setIcon(new ImageIcon(Class.class.getResource("/resources/img.png"))); 

Por ejemplo, si tiene una imagen en la carpeta res/image.png , puede escribir:

 try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream input = classLoader.getResourceAsStream("image.png"); // URL input = classLoader.getResource("image.png"); // <-- You can use URL class too. BufferedImage image = ImageIO.read(input); button.setIcon(new ImageIcon(image)); } catch(IOException e) { e.printStackTrace(); } 

En una línea:

 try { button.setIcon(new ImageIcon(ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("image.png")))); } catch(IOException e) { e.printStackTrace(); } 

Si la imagen es más grande que el botón, no se mostrará.

 buttonB.setIcon(new ImageIcon(this.getClass().getResource("imagename")));