aktuelles Projektverzeichnis

Status
Nicht offen für weitere Antworten.
S

SWTUser

Gast
Hello everybody,

gibt es eine Möglichkeit das aktuelle Projektverzeichnis zu erhalten?

Das Problem ist, dass in meinem Projekt Bilder angezeigt werden sollen, die Pfade für die Bilder (die im Projektordner liegen) sind "hart" eibngetragen. Deshalb läuft das Projekt auf anderen Rechnern natürlich nicht, deshalb würde ich den Pfad gerne immer aus dem aktuellen Projektverzeichnis zusammen bauen lassen.

Oder kann ich die Bilder auch direkt in die jar mit einbauen, sprich dass ich sie danach löschen kann, weil sie fest im Projekt mit drin sind?
 

Zed

Bekanntes Mitglied
Pfad: "/bilder/bild.jpg"

Bilder müssen im Projectverzeichniss/bilder liegen
 
S

SWTUser

Gast
Danke, so etwas habe ich in etwa gesucht.

Kann man es denn nicht so machen, dass die Bilder direkt "in der jar-Datei" drin sind, sodass ich die Bilder nicht immer mit der Anwendung weitergeben muss (die Leute werden sich freuen, wenn ich zusätzlich zu der Jar-Datei noch zig Bilder mitliefere...)
 
S

SWTUser

Gast
Hmm, das klappt leider so nicht:

private Image img = getToolkit().getImage("/bilder/Logo.png");

Da kommt eine ImageIOException...
 
Also ich hab für sowas immer ne eigene Toolkit-Klasse (Weil man sowieso 10000mal Bilder in der Oberfläche läd)

Code:
public class MyToolkit 
{

	/**
	 * Loads an ImageIcon from given filename, like image.format from standard image resource path
	 * @param filename
	 * @return
	 */
	public static ImageIcon loadImageIcon(String filename)
	{
		//Pfad in deinem Package, wo die Bilder liegen
		String path = "/de/firma/project/images/";

		ImageIcon loadIcon = new ImageIcon();
		
		try
    	{
			loadIcon = new ImageIcon(Toolkit.class.getResource(path + filename));        		       		
    	}
    	catch(NullPointerException npe)
    	{
    		//FileLogger.getDefaultLogger().debug("Can't load image icon " + filename + "!");
    		System.err.println("Can't load image icon " + filename + "!");
    	}
    	
		return loadIcon;		
	}
}


Vereinfacht "Bilder-Einfügen" in etwa so:
Code:
	JLabel label = new JLabel();
	label.setIcon(MyToolkit.loadImageIcon("bildname.png"));
 
S

SWTUser

Gast
Danke dafür,

habe das mal ausprobiert, aber er kennt in der ToolkitKlasse das Wort "Settings" nicht :-(

Wäre mit diesem Code auch möglich, dass ich die Bilder löschen kann, bzw. dass ich nur die Jar-Datei an die Anwender geben kann?
 
Oh, sorry, copy&paste-Fehler, korrigiert.
Also die Bilder kannst du in dein Package verschieben, dann werden die Bilder zur Laufzeit aus dem JAR-Archiv genommen.
 
S

SWTUser

Gast
Perfekt, danke! JEtzt klappts es.

Allerdings ist das noch nicht ganz meine Problemlösung :-(

Weil:

Ich gebe der Anwendung auch ein ImageIcon, und zwar hierüber:

Code:
File imageFile = new File(
			"D:\\Daten\\Websphere Studio\\Test\\bilder\\Logo.png");
	BufferedImage image = null;
	try {
		image = ImageIO.read(imageFile);
	} catch (IOException e1) {
		e1.printStackTrace();
	}
	this.setIconImage(image);

Dies kann ich ja mit dem obigen Code nicht lösen...

Weiterhin verwende ich ein SplashScreen (den ich hier im Forum gefunden und ein bisschen angepasst habe), sprich einen Ladebildschirm. Kann ich das auch dafür verwenden?

Code:
public class SplashScreen extends JFrame {

	private Image img;
	private int x, y;

	private Timer timer;

	public SplashScreen(File pic, int x, int y, long millis) {

		this.x = x;
		this.y = y;
		setSize(x, y);

		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

		setLocation(d.width / 2 - x / 2, d.height / 2 - y / 2);

		this.setUndecorated(true);

		MediaTracker mt = new MediaTracker(this);
		try {

			img = ImageIO.read(pic).getScaledInstance(x, y, Image.SCALE_SMOOTH);

		} catch (IOException e) {
			
			System.err.println("Konnte Datei nicht öffnen!");
		}

		if (img == null)
			img = this.createImage(x, y);

		
		mt.addImage(img, 0);

		try {
			mt.waitForAll();
		} catch (InterruptedException e1) {
			
			e1.printStackTrace();
		}
		
		timer = new Timer();
		timer.schedule(new ExitSplashTask(this), millis);
		
		setTitle("Programm wird gestartet...");
		setVisible(true);
	}

	public void paint(Graphics g) {
		super.paint(g);
		if (img != null)
			g.drawImage(img, 0, 0, this);
	}

	class ExitSplashTask extends TimerTask {

		private JFrame frm;

		public ExitSplashTask(JFrame frm) {
			this.frm = frm;
		}
		/* (non-Javadoc)
		 * @see java.util.TimerTask#run()
		 */
		public void run() {
			
			frm.setVisible(false);
			frm.dispose();
			
			new Anwendung();
		}

	}
}
 
SWTUser hat gesagt.:
Allerdings ist das noch nicht ganz meine Problemlösung :-(
Weil:
Ich gebe der Anwendung auch ein ImageIcon, und zwar hierüber:

Code:
File imageFile = new File(
			"D:\\Daten\\Websphere Studio\\Test\\bilder\\Logo.png");
	BufferedImage image = null;
	try {
		image = ImageIO.read(imageFile);
	} catch (IOException e1) {
		e1.printStackTrace();
	}
	this.setIconImage(image);

Dies kann ich ja mit dem obigen Code nicht lösen...
Doch, doch, und zwar mit nur einer Zeile Code:
Code:
	this.setIconImage(MyToolkit.loadImageIcon("Logo.png").getImage());
Logo.png sollte im Package an der im MyToolkit angegebenen Stelle liegen.

Für den SplashScreen funktioniert das auch, weil ImageIcon doch von Image erbt, ich komm ja an das Image über .getImage()...
 
G

Gast

Gast
WOW!! Klasse, das klappt.
Man, das mit den Bildern finde ich aber echt schwer!

Jetzt muss ich nur noch das SplashScreenProblem lösen :)
 
Gast hat gesagt.:
Jetzt muss ich nur noch das SplashScreenProblem lösen :)
Ich lade den SplashScreen immer während der Entwicklung über JVM-Argument (Eclipse: Run → Run Configurations → Arguments: VM-Arguments)
Code:
 -splash:src/de/firma/project/splashscreen.png

oder auf Kommandozeile: java -jar projekt.jar -splash:src/de/firma/project/splashscreen.png
dann nachher nach der Auslieferung dann immer über das Manifest.



Zugreifen auf das SplashScreen-Image kanns du dann über beispielsweise:
Code:
    /**
     * Change SplashScreen Appearance
     * @param status
     */
    private void renderStringOnSplashScreen(String status)
    {
        SplashScreen splashScreen = SplashScreen.getSplashScreen();
        if(splashScreen != null)
        {
            Graphics2D g = splashScreen.createGraphics();
            
            g.setComposite(AlphaComposite.Clear);
            g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            
            Rectangle bounds = splashScreen.getBounds();
            g.fillRect(0, 0, bounds.width, bounds.height);
            g.setPaintMode();
            g.setFont(new Font( "Arial", Font.BOLD, 12)); 
            g.setColor(new Color(255, 252, 241));
            g.drawString(status, 5, 410);
            splashScreen.update();
        }        
    }
Du kannst solange auf den SplashScreen was schreiben, bis der erste JFrame/JDialog etc. geladen wird.
 
G

Gast

Gast
Hmm, dazu hätte ich noch ein paar Fragen:

Die renderStringMethode: Wohin kopiere ich die? In die Main? Muss ich die extra aufrufen? Habe leider davon keine bis wenig Ahnung. Wäre damit auch das Problem gelöst, dass ich das Bild nicht mit austeilen muss, wenn ich die jar verteile? (Fragen über Fragen :) )
 
Ich glaub, es wird langsam ein wenig OffTopic ;)
Gast hat gesagt.:
Die renderStringMethode: Wohin kopiere ich die? In die Main? Muss ich die extra aufrufen?
Kopierst du am Besten in die Klasse, in der auch deine main-Methode steht. Aufrufen musst du die Methode manuell, der Splashscreen wird vollautomatisch angezeigt, renderStringOnSplashScreen(...) malt ja nur was auf den SplashScreen. Also im Hauptkonstruktor deiner Main-Klasse initialisierst du ja sicher die ganzen Programm-relevanten Sachen und bei jedem größeren oder längeren Schritt rufst du einfach
Code:
renderStringOnSplashScreen("Lade Sprachsystem");
//tue dieses
renderStringOnSplashScreen("Lade Kohlenhaufen für Katze");
//tue jenes
Gast hat gesagt.:
Wäre damit auch das Problem gelöst, dass ich das Bild nicht mit austeilen muss, wenn ich die jar verteile? (Fragen über Fragen :) )
Ja, weil die Grafik in der Jar mitgespeichert wird.
 
G

Gast

Gast
Sorry, dass ich mich erst jetzt wieder melde, aber ging nicht eher :)

Vielen Dank für die Hilfe, werde das mal alles so ausprobieren!
 
G

Gleiches Problem:

Gast
Hallo,

ich habe das gleiche Problem, wie hier beschrieben.

Ich suche auch ein Statement, mit dem ich auf das aktuelle Projektverzeichnis zugreifen kann.
Ich muss nämlich die jar-Datei in einem Ordner ausliefern. In diesem Ordner sollen auch die zu ladenden Bilder drin sein. Nun bin ich verzweifelt auf der Suche nach einem Statement, dass mir das aktuelle Verzeichnis wieder gibt (in Excel-VBA gibt es ein Statement à la: "CurrentProject.Path" und dann kann man damit weiterarbeiten).

Geht so etwas auch in Java?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben