2011-01-26 4 views
38

Я пытаюсь добавить изображение в JButton, и я не уверен, что мне не хватает. Когда я запускаю следующий код, кнопка выглядит точно так же, как если бы я создал ее без атрибута изображения. Water.bmp находится в корне моей папки проекта.Как добавить изображение в JButton

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

Это ** должна ** работа ... Вы можете попробовать использовать 'URL' форму' ImageIcon' конструктора и посмотреть, что оно делает? Может быть, он не может найти файл изображения по какой-то причине. –

+0

Да, теперь он работает. Никаких изменений в коде. Спасибо всем за ваши предложения. – kevinstueber

ответ

60

Я думаю, что ваша проблема в том месте изображения. Вы должны поместить его в источнике, а затем использовать его как это:

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

В этом примере предполагается, что изображение находится в SRC/ресурсы/папки.

+1

Я не знаю, почему, но это не работало ни для меня. Я даже создаю функцию, которая искала нужные файлы в каталоге и находила их - до сих пор нет значков. Итак, я просто использую строку: button1.setIcon («путь/pic.png»); - это работает. Любые идеи почему? –

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

ИЛИ использовать этот код

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

Слишком сложный.Существует встроенный механизм добавления значков в кнопки, почему возникают дополнительные проблемы? – Rogach

+4

-1: ** Путь ** слишком сложный. –

6

Это похоже на проблему с местоположением, потому что этот код отлично подходит для добавления значка.

Поскольку я не знаю структуру папок, я предлагаю добавить простую проверку:

File imageCheck = new File("water.bmp"); 

if(imageCheck.exists()) 
    System.out.println("Image file found!") 
else 
    System.out.println("Image file not found!"); 

Таким образом, если вы когда-нибудь ваше имя пути неправильно будет сказать вам, вместо того, чтобы не отображать ничего. Исключение должно быть выбрано, если файл не существует, т. К.

+0

не работает .... – YakRangi

2

я сделал только одну вещь, и она работала для меня .. проверить код этот метод есть ..

setResizable(false); 

если это ложь сделать это правда, и он будет работать нормально .. Я надеюсь, что это помог ..

+0

Рамка (?), Которая может быть изменена или нет, не имеет значения – kleopatra

+0

Да, вы, возможно, правы .. но когда у вас есть Borderlayout, а затем вы делаете это утверждение .. вы ограничиваете рамку .. таким образом, если вы сделаете true, это придаст вашему кадру пространство. – Dan

14

@Rogach

и вы можете, как добавить:

// 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); 
2
//paste required image on C disk 
JButton button = new JButton(new ImageIcon("C:water.bmp"); 
1

Этот код работа для меня:

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

Например, если у вас есть изображение в папке res/image.png вы можете написать:

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

В одной строке:

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

Если изображение больше, чем кнопка, то wi ll не показан.

Смежные вопросы