2013-07-17 3 views
0

Я искал в Интернете, пытаясь выяснить, как добавить иконку в свой JFrame, но я продолжаю получать ошибки. Я понимаю, что это было задано при переполнении стека, но решения для меня не работают. Вот мой код:JFrame Icon Image Not Working

ImageIcon imageIcon = new ImageIcon("src/slime.png"); 
    ImageIcon image = new ImageIcon("src/slime.gif"); 

    JLabel label = new JLabel(image, JLabel.CENTER); 
    label.setAlignmentX(0); 
    label.setAlignmentY(0); 
    label.setIcon(image); 

    JFrame window = new JFrame("Slime"); 
    window.setVisible(true); 
    window.setSize(250, 200); 
    window.setResizable(false); 
    window.setIconImage(newImageIcon(getClass().getResource("src/slime.png")).getImage()); 
    window.add(label); 

здесь ошибка я получаю: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.ImageIcon.<init>(ImageIcon.java:205) at MainJFrame.<init>(MainJFrame.java:39) at MainJFrame$1.run(MainJFrame.java:18) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:688) at java.awt.EventQueue$3.run(EventQueue.java:686) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:697) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Помощь будет очень высоко ценится. Примечание. Я попробовал window.setIconImage (imageIcon.getImage()); но это не работает, и мой другой образ, который я напечатал на экране, исчезает.

+0

Каковы ошибки, которые возникают? – Vulcan

+0

Можете вставить здесь свою ошибку? – kukis

+0

Ну, когда я пытаюсь window.setIconImage (ImageIO.read ("src/slime.png")); Я получаю ошибку. Метод read (File) в типе ImageIO не применим для аргументов (String) – Cj1m

ответ

0

Используйте getClass, чтобы получить изображение:

window.setIconImage(new ImageIcon(
       getClass().getResource("src/slime.png")).getImage()); 

Но если вы хотите добавить изображение в ЭТИКЕТКА затем добавить метку к использованию кадра вместо этого:

Image img = (new ImageIcon(getClass().getResource("src/slime.png"))).getImage(); 
JLabel lblIcon = new JLabel(new ImageIcon(newimg)); 
window.add(lblIcon); 

и если вы хотите изменить размер изображения, чтобы размер окна сделал это (поместите код перед добавлением его в окно):

Image newimg = img.getScaledInstance(window.getWidth() , window.getHeight(), java.awt.Image.SCALE_SMOOTH);// resizing image to the window size 

EDIT:

, конечно, вы не можете использовать getClass() в public static void main() метод вы должны поместить ваш код где-то non-static как конструктор класса, например.

public class MainForm extends javax.swing.JFrame { 

/** 
* Creates new form MainForm 
*/ 
public MainForm() { 
    //put your code here... 
    window.setIconImage(new ImageIcon(
      getClass().getResource("src/slime.png")).getImage()); 
} 
public static void main(String args[]) { 
    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
       new MainForm().setVisible(true); 
      } 
     }); 
    } 

Это всегда хорошо try-catch блок, чтобы проверить, если вы получаете изображение правильно. хотя в этой ситуации, когда вы получаете код внутри своих пакетов, не так уж и необходимо, но если вы собираетесь получить какой-либо ресурс вне вашего проекта, убедитесь, что вы открыли его.

+0

ошибка: Невозможно сделать статическую ссылку на нестатический метод getClass() из типа Object – Cj1m

+0

@ user1952565 удалить свой код из 'static main' и поместить их в другой класс и сделать из него экземпляр. – sajjadG

+0

Какой экземпляр? – Cj1m

0

Попробуйте это. Довольно то же, что и ответ sajjad, есть проверка, чтобы убедиться, что URL-адрес изображения не равен нулю, прежде чем использовать его.

java.net.URL imageUrl = YourClass.class.getResource("/IconImage.png"); 
if(imgUrl != null){ 
    setIconImage(new ImageIcon(imageUrl).getImage()); 
} 
0

Попробуйте это, он должен работать

frame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/slime.gif"))); 

Вы писали,

newImageIcon() 

Это может быть метод, поскольку он составлен для вас. Я думаю, вам, возможно, придется написать его как new ImageIcon() Возможно, это проблема. javax.swing.ImageIcon не создается.

Просто, почему бы вам не использовать

setIconImage(imageIcon.getImage()); 

Вот полный код,

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class IconImageDemo1 extends JFrame 
{ 

    public IconImageDemo1() 
    { 
     createAndShowGUI(); 
    } 

    private void createAndShowGUI() 
    { 
     setTitle("IconImage Demo"); 
     setLayout(new FlowLayout()); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("icons/camera.png"))); 

     setLocationRelativeTo(null); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       new IconImageDemo1(); 
      } 
     }); 
    } 
} 
+0

Невозможно создать статическую ссылка на нестатический метод getClass() из типа Object – Cj1m

+0

Все компоненты по умолчанию для компоновки потока. –

0

во-первых, только по соображениям безопасности, не пытайтесь сделать свой JFrame в основной метод. Вот почему вы получаете некоторые статические ошибки от некоторых решений. На мой взгляд, статика - это большая проблема, потому что, как только вы станете одним статическим, вы делаете их статичными. Попробуйте инициализировать JFrame в конструкторе вместо основного метода.Просто сделайте новый объект MainJFrame в основной метод:

public static void main(String[] args){ 
    MainJFrame frame = new MainJFrame(); 
} 

И поставил весь свой код в конструкторе, если вы не знаете, что это такое, что вы должны знать, то это то, что один выглядит следующим образом:

public MainJFrame(){ 
    //This is a constructor 
    //All frame init code in here 
} 

Затем поместите один и тот же код там, но поставить пробел между new и ImageIcon в вашем setIconImage() аргумента. Таким образом, весь конструктор должен выглядеть следующим образом:

public MainJFrame(){ 
    ImageIcon imageIcon = new ImageIcon("src/slime.png"); 
    ImageIcon image = new ImageIcon("src/slime.gif"); 

    JLabel label = new JLabel(image, JLabel.CENTER); 
    label.setAlignmentX(0); 
    label.setAlignmentY(0); 
    label.setIcon(image); 

    JFrame window = new JFrame("Slime"); 
    window.setVisible(true); 
    window.setSize(250, 200); 
    window.setResizable(false); 
    window.setIconImage(new ImageIcon(getClass().getResource("src/slime.png")).getImage()); 
    window.add(label); } 

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

window.setIconImage(ImageIO.read(new File("folder/to/file.png"))); 

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