我在学校学到了一些有关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();
}
}
我希望所有内容对您来说都是清楚的,因为我的代码的一部分是德语。如果您有任何疑问或需要更多代码,请告诉我。非常感谢您的帮助。