2010-05-30 4 views
3

Это мой код, он действительно находит изображение, так что это не мое дело, моя забота заключается в том, как сделать это изображение фоном панели. Я пытаюсь работать с графикой, но я не работаю, никаких идей? пожалуйста??JPanel background image

try { 
      java.net.URL imgURL = MAINWINDOW.class.getResource(imagen); 

      Image imgFondo = javax.imageio.ImageIO.read(imgURL); 
      if (imgFondo != null) { 
       Graphics grafica=null; 
       grafica.drawImage(imgFondo, 0, 0, this); 
       panel.paintComponents(grafica); 
      } else { 
      System.err.println("Couldn't find file: " + imagen); 
      } 

     } catch... 

ответ

2

В вашем коде есть ошибка. Вы устанавливаете grafica на линию null, прежде чем вы разыщите ее. Это, безусловно, вызовет NullPointerException. Вместо объявления вашего собственного объекта Graphics вы должны использовать тот, который был передан методу, который вы будете использовать для рисования. Для этого в свинг, вы должны реализовать метод paintComponent, чтобы нарисовать изображение, что-то вроде этого:

public void paintComponent(Graphics grafica) { 
    grafica.drawImage(imgFondo, 0, 0, this); 
    } 

Обратите внимание, что вы не хотите делать долго выполняющихся задач, как чтение в файлах изображений с диска в покраска нить. В приведенном выше примере предполагается, что вы уже загрузили imgFondo и сохранили его таким образом, чтобы он был доступен в методе paintComponent.

+0

Спасибо, так это значит, что я должен переопределить метод? или просто реализовать его в моем классе? –

+0

Если вы его реализуете, вы будете переопределять метод супер. – akf

+0

'null); // нет необходимости в ImageObserver здесь. Лучше сделать * без презумпций *, как будет использоваться класс. –

0

Если вы только собираетесь нарисовать изображение с его первоначальным размером, вам нужно только добавить изображение в JLabel, а затем использовать ярлык в качестве контейнера, установив его диспетчер компоновки.

Единственный раз, когда вам нужно делать обычную роспись, - это если вы хотите масштабировать или накладывать фоновое изображение или делать какую-то другую причудливую картину.

См. Background Panel для получения дополнительной информации об обоих подходах.

также, ознакомьтесь с разделом из учебника Swing по телефону Custom Painting.

+0

Спасибо! ссылки очень полезны. У меня есть другой вопрос: я знаю, как поместить изображение в ярлык, но как я могу сделать этот ярлык под всеми другими компонентами? В моем приложении я создаю как динамические, так и статические компоненты. –

+0

Я не понимаю вопроса. Я привел вам пример того, как это сделать в ссылке «Фоновая панель». Я дал вам 4 строки кода, которые показывают, как заставить ярлык вести себя так же, как JPanel, чтобы вы могли использовать его в качестве области содержимого фрейма. Если вам нужна дополнительная помощь, отправьте свой SSCCE: http://sscce.org – camickr