Java文件/路径问题Eclipse中的Programm可以工作,但不能作为导出的jar(未知源)

时间:2018-09-18 19:25:43

标签: java eclipse image file jar

我在学校学到了一些有关Java的知识,因为我玩得很开心,所以我尝试制作自己的小程序。目前,我正在尝试做一个可以组织收藏的程序。这是我第一次要使用图片,但仍然遇到一些问题,因此希望您能为我提供帮助。谢谢!

我正在使用一些JGUI Toolbox,我们有一个毛茸茸的学校,有一个专门的图片班:

    //%$JGUIToolbox$%//ID fuer Toolboxdateien

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
//import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

/**
 * <h1>Bildklasse zur Darstellung einer Bilddatei</h1>.<br/>
 * 
 * @author Hans Witt, Claus Behl
 * 
 * @version Version 1 (4.12.08)<br/>
 *          Version 5.0: (4.9.2010) Entfernen fuer Graphikkomponente eingefuehrt<br/>
 * 
 */
public class Bild implements IComponente {
    private CBild obj;
    private BufferedImage bild;
    protected int breite = 0;
    protected int hoehe = 0;

    protected int xPos = 0;
    protected int yPos = 0;
    protected boolean sichtbar = true;
    protected boolean zoomen = false;

    /**
     * 
     * @param filename
     */
    public Bild(String filename) {
        this(Zeichnung.gibZeichenflaeche(), filename);
    }

    /**
     * 
     * @param datei
     */
    public Bild(BilddateiAbstrakt datei) {
        this(Zeichnung.gibZeichenflaeche(), datei);
    }

    /**
     * 
     * @param neueBreite
     * @param neueHoehe
     * @param filename
     */
    public Bild(int neueBreite, int neueHoehe, String filename) {
        this(Zeichnung.gibZeichenflaeche(), 0, 0, neueBreite, neueHoehe,
                filename);
    }

    /**
     * 
     * @param neueBreite
     * @param neueHoehe
     * @param datei
     */
    public Bild(int neueBreite, int neueHoehe, BilddateiAbstrakt datei) {
        this(Zeichnung.gibZeichenflaeche(), 0, 0, neueBreite, neueHoehe, datei);
    }

    /**
     * 
     * @param neuesX
     * @param neuesY
     * @param neueBreite
     * @param neueHoehe
     * @param filename
     */
    public Bild(int neuesX, int neuesY, int neueBreite, int neueHoehe,
            String filename) {
        this(Zeichnung.gibZeichenflaeche(), neuesX, neuesY, neueBreite,
                neueHoehe, filename);
    }

    /**
     * 
     * @param neuesX
     * @param neuesY
     * @param neueBreite
     * @param neueHoehe
     * @param datei
     */
    public Bild(int neuesX, int neuesY, int neueBreite, int neueHoehe,
            BilddateiAbstrakt datei) {
        this(Zeichnung.gibZeichenflaeche(), neuesX, neuesY, neueBreite,
                neueHoehe, datei);
    }

    /**
     * 
     * @param behaelter
     * @param filename
     */
    public Bild(IContainer behaelter, String filename) {
        this(behaelter, 0, 0, 100, 100, filename);
    }

    /**
     * 
     * @param behaelter
     * @param datei
     */
    public Bild(IContainer behaelter, BilddateiAbstrakt datei) {
        this(behaelter, 0, 0, 100, 100, datei);
    }

    /**
     * 
     * @param behaelter
     * @param neuesX
     * @param neuesY
     * @param neueBreite
     * @param neueHoehe
     * @param filename
     */
    public Bild(IContainer behaelter, int neuesX, int neuesY, int neueBreite,
            int neueHoehe, String filename) {
        bild = setzeBilddatei(filename);
        obj = new CBild(bild);
        behaelter.add(obj, 0);
        breite = neueBreite;
        hoehe = neueHoehe;

        if (bild != null) {
            setzeDimensionen(neuesX, neuesY, bild.getWidth(), bild.getHeight());
        } else {
            setzeDimensionen(neuesX, neuesY, neueBreite, neueHoehe);
        }

        setzeDimensionen(neuesX, neuesY, neueBreite, neueHoehe);

        behaelter.validate();
    }

    /**
     * 
     * @param behaelter
     * @param neuesX
     * @param neuesY
     * @param neueBreite
     * @param neueHoehe
     * @param datei
     */
    public Bild(IContainer behaelter, int neuesX, int neuesY, int neueBreite,
            int neueHoehe, BilddateiAbstrakt datei) {
        bild = datei.leseBild();
        obj = new CBild(bild);
        behaelter.add(obj, 0);
        breite = neueBreite;
        hoehe = neueHoehe;

        if (bild != null) {
            setzeDimensionen(neuesX, neuesY, bild.getWidth(), bild.getHeight());
        } else {
            setzeDimensionen(neuesX, neuesY, neueBreite, neueHoehe);
        }

        setzeDimensionen(neuesX, neuesY, neueBreite, neueHoehe);

        behaelter.validate();
    }

    public int leseBildBreite() {
        if (bild == null)
            return 0;
        return bild.getWidth();
    }

    public int leseBildHoehe() {
        if (bild == null)
            return 0;
        return bild.getHeight();
    }

    /**
     * Das Interface IComponente fordert eine Methode die eine BasisComponente
     * zurueckliefert. Sie wird benoetigt, um ein Objekt zu einem anderen
     * Behaelter hinzuzufuegen
     */
    @Override
    public BasisComponente getBasisComponente() {
        return obj;
    }

    static int lesen = 0;

    /*
     * Waehle das Bild aus!
     */

private BufferedImage setzeBilddatei(String filename) {   //This is the method to set a new picture, I think it tries to differentiate between pictures in the jar file and pictures on the harddrive, but it seems to be "broken"
        BufferedImage bBild;
        try {

            // Aus jar-Datei lesen
            //InputStream stream = new FileInputStream(filename);
            InputStream stream = Bild.class.getResourceAsStream("/" + filename);
            if (stream != null) {
                // lesen aus jar
                bBild = ImageIO.read(stream);
            } else if (!Zeichnung.applet) {
                bBild = ImageIO.read(new File(filename));
            } else {
                lesen++;
                int height = -1;
                int width = -1;

                Image bild = Zeichnung.pApplet.getImage(
                        Zeichnung.pApplet.getDocumentBase(), filename);
                height = bild.getHeight(null);
                width = bild.getWidth(null);
                if ((height < 0) || (width < 0)) {
                    bBild = new BufferedImage(100, 100,
                            BufferedImage.TYPE_BYTE_BINARY);

                    Graphics2D g2 = bBild.createGraphics();
                    g2.drawString("!" + lesen, 20, 50);

                } else {
                    bBild = new BufferedImage(width, height,
                            BufferedImage.TYPE_4BYTE_ABGR);
                    Graphics2D g2 = bBild.createGraphics();
                    g2.drawImage(bild, 0, 0, null);
                }
            }
        } catch (IOException e) {
            // javax.swing.JOptionPane.showMessageDialog(null,"Das Bild ist nicht vorhanden");
            bBild = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_BINARY);

            Graphics2D g2 = bBild.createGraphics();
            g2.drawString("Kein Bild !", 20, 50);
        }

        return bBild;
    }

    /*
     * Bild wird in das Fenster eingepasst
     */
    public void einpassen() {
        zoomen = true;

        double faktor = 1;

        if (bild != null) {
            faktor = (breite * 1.0) / (bild.getWidth() * 1.0);

            double faktor2 = (hoehe * 1.0) / (bild.getHeight() * 1.0);

            if (faktor2 < faktor) {
                faktor = faktor2;
            }
        } else {
            faktor = 1;
        }

        obj.setzeAnpassungsfaktor(faktor);
    }

    /*
     * Keine Anpassung des Bilds
     */
    public void normal() {
        zoomen = false;
        obj.setzeAnpassungsfaktor(1);
    }

    /**
     * zeigt Bild vollstaendig an
     */
    public void expandieren() {
        setzeDimensionen(xPos, yPos, bild.getWidth(), bild.getHeight());
    }

    /*
     * @param String filename Der Name der gewuenschten BilddateiAbstrakt
     */
    public void wechsleBild(String filename) {
        bild = setzeBilddatei(filename);

        if (bild != null) {
            if (zoomen) {
                setzeDimensionen(xPos, yPos, breite, hoehe);
            } else {
                setzeDimensionen(xPos, yPos, bild.getWidth(), bild.getHeight());
            }
        }

        obj.wechsleBild(bild);
    }

    /*
     * @param String filename Der Name der gewuenschten BilddateiAbstrakt
     */
    public void wechsleBild(BilddateiAbstrakt datei) {
        bild = datei.leseBild();

        if (bild != null) {
            if (zoomen) {
                setzeDimensionen(xPos, yPos, breite, hoehe);
            } else {
                setzeDimensionen(xPos, yPos, bild.getWidth(), bild.getHeight());
            }
        }

        obj.wechsleBild(bild);
    }

    public void sichtbarMachen() {
        sichtbar = true;
        obj.sichtbarMachen();
    }

    /**
     * Mache unsichtbar. Wenn es bereits unsichtbar ist, tue nichts.
     */
    public void unsichtbarMachen() {
        sichtbar = false;
        obj.unsichtbarMachen();
    }

    /**
     * Bewege horizontal um 'entfernung' Bildschirmpunkte.
     */
    public void nachRechtsBewegen() {
        horizontalBewegen(20);
    }

    /**
     * Bewege einige Bildschirmpunkte nach links.
     */
    public void nachLinksBewegen() {
        horizontalBewegen(-20);
    }

    /**
     * Bewege einige Bildschirmpunkte nach oben.
     */
    public void nachObenBewegen() {
        vertikalBewegen(-20);
    }

    /**
     * Bewege einige Bildschirmpunkte nach unten.
     */
    public void nachUntenBewegen() {
        vertikalBewegen(20);
    }

    /**
     * Bewege vertikal um 'entfernung' Bildschirmpunkte.
     */
    public void langsamVertikalBewegen(int entfernung) {
        int delta;

        if (entfernung < 0) {
            delta = -1;
            entfernung = -entfernung;
        } else {
            delta = 1;
        }

        for (int i = 0; i < entfernung; i++) {
            vertikalBewegen(delta);
            StaticTools.warte(10);
        }
    }

    /**
     * Bewege vertikal um 'entfernung' Bildschirmpunkte.
     */
    public void langsamHorizontalBewegen(int entfernung) {
        int delta;

        if (entfernung < 0) {
            delta = -1;
            entfernung = -entfernung;
        } else {
            delta = 1;
        }

        for (int i = 0; i < entfernung; i++) {
            horizontalBewegen(delta);
            StaticTools.warte(10);
        }
    }

    public void setzeGroesse(int neueBreite, int neueHoehe) {
        breite = neueBreite;
        hoehe = neueHoehe;

        if (zoomen) {
            einpassen();
        }

        obj.setzeGroesse(breite, hoehe);
    }

    /**
     * neue Position
     * 
     * @param neuesX
     * @param neuesY
     */
    public void setzePosition(int neuesX, int neuesY) {
        xPos = neuesX;
        yPos = neuesY;
        obj.setzePosition(xPos, yPos);
    }

    // Methode noetig zum Hinzufuegen mit Anpassung beim Behaelter
    // Die Enden werden relativ zur aktuellen position verschoben
    public void verschieben(int dx, int dy) {
        setzePosition(xPos + dx, yPos + dy);
    }

    /**
     * 
     * @param neuesX
     * @param neuesY
     * @param neueBreite
     * @param neueHoehe
     */
    public void setzeDimensionen(int neuesX, int neuesY, int neueBreite,
            int neueHoehe) {
        xPos = neuesX;
        yPos = neuesY;
        breite = neueBreite;
        hoehe = neueHoehe;

        if (zoomen) {
            einpassen();
        }

        obj.setzeDimensionen(xPos, yPos, breite, hoehe);
    }

    /**
     * Bewege horizontal um 'entfernung' Bildschirmpunkte.
     */
    public void horizontalBewegen(int entfernung) {
        xPos += entfernung;
        obj.setzePosition(xPos, yPos);
    }

    /**
     * Bewege vertikal um 'entfernung' Bildschirmpunkte.
     */
    public void vertikalBewegen(int entfernung) {
        yPos += entfernung;
        obj.setzePosition(xPos, yPos);
    }

    /**
     * Entfernen des Graphikobjekts
     */
    public void entfernen() {
        if (obj != null) {
            obj.ausContainerEntfernen();
            obj = null;
        }
    }

    /**
     * Destruktor
     */
    @Override
    protected void finalize() {
        if (!Zeichnung.verweistesGUIElementEntfernen)
            return;
        if (obj != null)
            entfernen();
    }

}

@SuppressWarnings("serial")
class CBild extends BasisComponente {
    private BufferedImage bild;
    private Image bildM;
    private double anpassung = 1; // Faktor zum Einpassen an das

    // Fenstert

    /**
     * Konstruktor ohne Beschriftung
     */
    public CBild(BufferedImage bild) {
        this.bild = bild;
        this.bildM = bild;
    }

    public void wechsleBild(BufferedImage bild) {
        this.bild = bild;
        setzeZoomfaktor(zoomFaktor);
    }

    /**
     * Die Darstellung der Komponente wird hier programmiert.
     */
    @Override
    public void paintComponentSpezial(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        // Graphik-Abmessungen
        breite = getSize().width;
        hoehe = getSize().height;

        g2.drawImage(bildM, 0, 0, null);
    }

    /*
     * Anpassung fuer Einfuegen in das Fenster
     */
    public void setzeAnpassungsfaktor(double zf) {
        anpassung = zf;
        setzeZoomfaktor(zoomFaktor);
    }

    @Override
    public double setzeZoomfaktor(double zf) {
        zoomFaktor = zf;
        bzf = ((IContainer) this.getParent()).getBehaelterZoom();
        bildM = bild.getScaledInstance((int) (bild.getWidth() * zoomFaktor
                * bzf * anpassung),
                (int) (bild.getHeight() * zoomFaktor * bzf * anpassung),
                Image.SCALE_SMOOTH);
        zoomen();

        if (sichtbar) {
            ((IContainer) this.getParent()).setzeKomponentenKoordinaten(this,
                    xPos, yPos, breite, hoehe);
        } else {
            ((IContainer) this.getParent()).setzeKomponentenKoordinaten(this,
                    xPos, yPos, 0, 0);
        }

        return zoomFaktor;
    }
}

在此VIEW_Start类中,是用户在启动程序时应看到的所有内容。我还想显示一张保存在C:/Users/ME/Pictures/fl/stopper-1087835_1280.png中的图片,当在eclipse中打开程序时,一切正常,但是当我尝试打开导出的jar时(将所需的库打包在jar中)。 CMD告诉我这个错误:

    Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.IllegalArgumentException: name
        at sun.misc.URLClassPath$Loader.findResource(Unknown Source)
        at sun.misc.URLClassPath.findResource(Unknown Source)
        at java.net.URLClassLoader$2.run(Unknown Source)
        at java.net.URLClassLoader$2.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findResource(Unknown Source)
        at java.lang.ClassLoader.getResource(Unknown Source)
        at java.net.URLClassLoader.getResourceAsStream(Unknown Source)
        at java.lang.Class.getResourceAsStream(Unknown Source)
        at Bild.setzeBilddatei(Bild.java:208)
        at Bild.<init>(Bild.java:129)
        at Bild.<init>(Bild.java:83)
        at VIEW_Start.erzeugen(VIEW_Start.java:50)
        at VIEW_Start.<init>(VIEW_Start.java:39)
        at CONTROLLER.<init>(CONTROLLER.java:16)
        at START.main(START.java:6)

这是VIEW_Start类的代码:

import java.awt.Toolkit;
import javax.swing.JFrame;
//import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class VIEW_Start {
    //Layout und Grafik
    static int width=Toolkit.getDefaultToolkit().getScreenResolution();
    protected Rechteck hintergrund_s;
    protected Taste suchen, plus, bearbeiten;   //Knöpfe
    protected Ausgabe anzeige1, anzeige2, manage;

    protected Bild vorschau;

        //Zeichen
        protected char b = '\u270E';    //Stift
        protected char n = '\u002B';    //Plus
    //Verknüpfung MVC
    protected CONTROLLER control;
    protected MODEL model;

    public VIEW_Start(CONTROLLER con, MODEL mod) {
        //Verknüpfung
        control = con;

        model = mod;


        //Layout und Grafik


            Zeichnung.setzeScrollbar(false);

            //Zeichnung.single.setAlwaysOnTop(true);

            Zeichnung.single.setResizable(false);           

            this.erzeugen();

    }

    public void erzeugen() {

        int width_new = width/10; //to adapt the program to different resolutions

            hintergrund_s = new Rechteck(width_new*0,width_new*0,width_new*120,width_new*80);
            hintergrund_s.setzeFarbe("hintergrund");  //flat Backgroundcolor

            vorschau = new Bild(width_new*35,width_new*6,width_new*50,width_new*50,"C:/Users/ME/Pictures/fl/stopper-1087835_1280.png");   //The picture I want to show from the path

            vorschau.einpassen();


            //Headline
                manage = new Ausgabe("Kronkorken-Manager",width_new*40,width_new*25,width_new*40,width_new*6);
                manage.setzeSchriftgroesse(width_new*3);


            //Show Date and Time
                SimpleDateFormat date1 =new SimpleDateFormat("HH:mm");
                String datef1 = date1.format(new Date());

                SimpleDateFormat date2 =new SimpleDateFormat("dd.MM.yyyy");
                String datef2 = date2.format(new Date());

                anzeige1 = new Ausgabe (datef1, width_new*43, width_new*30, width_new*20, width_new*10);
                anzeige1.setzeSchriftgroesse(width_new*2);
                anzeige2 = new Ausgabe (datef2, width_new*55, width_new*30, width_new*20, width_new*10);
                anzeige2.setzeSchriftgroesse(width_new*2);


            //Edit-Button
                bearbeiten = new Taste(""+b+"",width_new*10,width_new*65,width_new*10,width_new*10);
                bearbeiten.setzeSchriftgroesse(width_new*4);
                bearbeiten.setzeHintergrundfarbe("akzent");
                bearbeiten.setzeSchriftfarbe("weiss");
                bearbeiten.setzeLink(control);
                bearbeiten.setzeID(0);

            //Search-Button
                suchen = new Taste("SUCHEN",width_new*40,width_new*65,width_new*40,width_new*10);
                suchen.setzeSchriftgroesse(width_new*3);
                suchen.setzeHintergrundfarbe("akzent");
                suchen.setzeSchriftfarbe("weiss");
                suchen.setzeLink(control);
                suchen.setzeID(1);

            //Add-Button
                plus = new Taste(""+n+"",width_new*100,width_new*65,width_new*10,width_new*10);
                plus.setzeSchriftgroesse(width_new*4);
                plus.setzeHintergrundfarbe("akzent");
                plus.setzeSchriftfarbe("weiss");
                plus.setzeLink(control);
                plus.setzeID(2);
    }

    public void loeschen() { //deletes all objects
        hintergrund_s.entfernen();
        manage.entfernen();
        anzeige1.entfernen();
        anzeige2.entfernen();
        bearbeiten.entfernen();
        suchen.entfernen();
        plus.entfernen();

    }

}

我希望所有内容对您来说都是清楚的,因为我的代码的一部分是德语。如果您有任何疑问或需要更多代码,请告诉我。非常感谢您的帮助。

0 个答案:

没有答案