Проблемы с загрузкой изображения для графического интерфейса, когда классы находятся в пакете - PullRequest
3 голосов
/ 17 февраля 2012

Я некоторое время программировал на Java, но никогда особо ничего не делал с пакетами Swing.В настоящее время я разрабатываю графический интерфейс для программы вызова и ответа AI, несмотря на относительную сложность (по крайней мере, для меня) всего остального, что я делал, - эта проблема загрузки изображений, которая казалась чрезвычайно простой для реализации, ставит меня в тупик.

Следующие классы работают, если не в пакете, что меня действительно смущает.Я пробовал несколько разных предложений по реализации (одно из Head First Java, одно из учебников docs.oracle.com, а другое с использованием того, что предлагает http://leepoint.net/notes-java/GUI-lowlevel/graphics/45imageicon.html).

package CaRII;


import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class P{


public static void main(String [] args){

    P p = new P();
    p.go();

}
public void go(){

    JFrame frame = new JFrame("CaRRI: Call and Response Intelligent Improviser");
    PBackground mainPanel = new PBackground();

    frame.getContentPane().add(BorderLayout.CENTER, mainPanel);

    frame.setSize(800,500);
    frame.setVisible(true);


}

}

package CaRII;
import java.awt.*;
import javax.swing.*;

public class PBackground extends JPanel{

public Image backgroundImage;


public PBackground(){

    backgroundImage = Toolkit.getDefaultToolkit().createImage("CaRIIBackGround.jpg");

}

public PBackground(LayoutManager layout){

    backgroundImage = Toolkit.getDefaultToolkit().createImage("CaRIIBackGround.jpg");

}
public void paint(Graphics g){

    g.drawImage(backgroundImage,0,0,null);
}
}

Как я уже сказал, странно то, что он не отображает изображение, если эти два класса находятся в пакете CaRRI;но если я скомпилирую и выполню их без объявления пакета, они будут работать нормально (например, изображение не загружается, пока размер окна не изменится ... но я видел решения в Интернете для этого, поэтому я смогу отсортировать его, как только загрузю его в пределахпакет).Я писал в XCode и JEdit, и изображение хранится в папке пакета внутри исходного кода (/src/CaRII/P.java ... /src/CaRII/CaRIIBackGround.jpg), я также пытался сохранить изображение впапка resources внутри / src / и использующая

ImageIcon(getClass().getResource("/resources/CaRIIBackGround.jpg)).getImage(); 

, но это вызывает другую ошибку при запуске

Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:181)
at CaRII.PBackground.<init>(PBackground.java:19)
at CaRII.P.go(P.java:21)
at CaRII.P.main(P.java:15)

Любая помощь будет высоко ценится, так как, несмотря на ее простоту, это все меня озадачиваетутром и у меня есть много других классов, чтобы написать.

Спасибо (Вот изображение (я новый пользователь, поэтому я не могу публиковать изображения, но это ссылка на него)) http://imageshack.us/photo/my-images/189/cariibackground.jpg

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012
package CaRII;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

public class P{

    public static void main(String [] args){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                P p = new P();
                p.go();
            }
        });
    }

    public void go(){
        try {
            JFrame frame = new JFrame("CaRRI: Call and Response Intelligent Improviser");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            PBackground mainPanel = new PBackground();

            frame.getContentPane().add(BorderLayout.CENTER, mainPanel);

            //frame.setSize(800,500);
            frame.pack();
            frame.setMinimumSize(frame.getSize());
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

class PBackground extends JPanel{

    public BufferedImage backgroundImage;


    public PBackground() throws Exception {
        URL url = new URL("http://desmond.imageshack.us/Himg189/" + 
            "scaled.php?server=189&filename=cariibackground.jpg&res=medium");
        // You might form that URL using something like..
        //URL url = this.getClass().getResource("/CaRIIBackGround.jpg");

        backgroundImage = ImageIO.read(url);
        Dimension d = new Dimension(
            backgroundImage.getWidth(),
            backgroundImage.getHeight());
        setPreferredSize(d);
    }

    /*  What was this supposed to achieve?
    public PBackground(LayoutManager layout){
        backgroundImage = Toolkit.getDefaultToolkit().createImage("CaRIIBackGround.jpg");
    }
    */

    // Don't override paint() in a Swing panel!
    //public void paint(Graphics g){
    @Override
    public void paintComponent(Graphics g) {
        // USE the ImageObserver!
        //g.drawImage(backgroundImage,0,0,null);
        g.drawImage(backgroundImage,0,0,getWidth(),getHeight(),this);
    }
}
1 голос
/ 17 февраля 2012

Проверьте эту ссылку, это должна быть ваша структура каталогов, для размещения изображений, также проверьте пример кода. МОЙ ПРОЕКТ . Я только что создал этот проект, чтобы вы знали, как все должно быть доступно, если вы делаете это вручную.

1 голос
/ 17 февраля 2012

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

import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;

import javax.swing.ImageIcon;
import javax.swing.JPanel;


public class PBackground extends JPanel{

    public Image backgroundImage;


    public PBackground(){
        super();
        initImage();

    }

    private void initImage() {
        backgroundImage = new ImageIcon(getClass().getResource("/resources/cariibackground.jpg")).getImage();
    }

    public PBackground(LayoutManager layout){
        super(layout);
        initImage();

    }
    @Override
    public void paint(Graphics g){

        g.drawImage(backgroundImage,0,0,null);
    }
}

Но будьте осторожны, у меня та же ошибка (исключение в потоке "main" java.lang.NullPointerException), чем у вас, когда я генерирую файл JAR из-за верхнего регистра в имени изображения. Вы должны использовать только строчные имена для своих ресурсов, если вы используете Windows.

С уважением,

...