Como faço para adicionar uma imagem a um JButton

Eu estou tentando adicionar uma imagem para um JButton e não tenho certeza do que estou perdendo. Quando executo o código a seguir, o botão parece exatamente o mesmo de se eu o criei sem nenhum atributo de imagem. Water.bmp está na raiz da pasta do meu projeto.

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

Eu acho que o seu problema está no local da imagem. Você deve colocá-lo em sua fonte e usá-lo assim:

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

Neste exemplo, supõe-se que a imagem esteja na pasta src / resources /.

@Rogach

e você pode gostar de adicionar:

 // 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 um problema de localização porque esse código é perfeitamente adequado para adicionar o ícone.

Como não conheço sua estrutura de pastas, sugiro adicionar uma verificação simples:

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

Desta forma, se você tiver o nome do caminho errado, ele dirá em vez de exibir nada. Exceção deve ser lançada se o arquivo não existir, tho.

Eu fiz apenas uma coisa e funcionou para mim .. verifique se o seu código é esse método lá ..

 setResizable(false); 

se falso tornar verdade e vai funcionar muito bem .. Espero que ajudou ..

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

OU use 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 mim:

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

Você coloca sua imagem na pasta resources e usa o seguinte código:

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

Por exemplo, se você tem imagem na pasta res/image.png você pode escrever:

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

Em uma linha:

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

Se a imagem for maior que o botão, ela não será mostrada.

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