Export pliku graficznego do Jar Eclipse

0

Witam
Mam mały problem a nigdzie na forum ani w necie nie znalazłem odpowiedzi, chociaż widziałem, że kilku użytkowników miało ten problem.
Mój program pobiera sobie z "zewnątrz" plik graficzny. Ten plik był to raz wrzucany do folderu /scr innym razem tworzyłem mu swój folder. I z poziomu Eclipse program normalnie się wyświetlał i pokazywał obrazek. Jednakże gdy exportuje plik do jar. To w ogóle nie ma tego katalogu ani obrazka. Program go nie wyświetla. Jestem pewien, że go tam nie ma bo otwierałem go winrarem. Wrzucenie katalogu z obrazkiem na "chamca" do winrara również nie skutkuje bo program się zachowuje jakby ścieżka była niepoprawna i wciąż go nie wyświetla. Podczas exportu próbowałem zaznaczania różnych opcji dot. exportowania, jednak w drzewku katalogów, ktore miały zostać spakowane w ogóle nie było katalogu ani pliku, na których mi zależało.

Tu jest kod odpowiadający za obsługę tej grafiki.

package CV;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Zdjecie extends JPanel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 
	 */
	
	private BufferedImage image;

	public Zdjecie() {
		super();

		File imageFile = new File("src/image/Ja.jpg");
		try {
			image = ImageIO.read(imageFile);
		} catch (IOException e) {
			System.err.println("Blad odczytu obrazka");
			e.printStackTrace();
		}

		Dimension dimension = new Dimension(image.getWidth(), image.getHeight());
		setPreferredSize(dimension);
	}

	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(image, 0, 0, this);
	

	}

}
 

Proszę o pomoc.

1

Pliki graficzne, które są w jarze czyta się inaczej.

NazwaKlasy.class.getResource("images/Open.gif"))

Ścieżka do pliku graficznego (images/Open.gif) jest względna (względem pliku NazwaKlasy.class). Taki odczyt działa również w Eclipse i w konsoli.

0

Rozumiem, ale podczas exportowania do jar w ogóle nie wrzuca mi tego zdjęcia ani katalogu. Mój jar ich nie zawiera. Jak zrobić, żeby to się poprawnie wyexportowało razem z folderem zawierającym mój plik graficzny?

0

Pliki i foldery daj do folderu głównego projektu a nie src.

0

Próbowałem tak zrobić, ale to również nie zdaje egzaminu. Tak robiłem wcześniej. Eclipse nawet nie bierze pod uwagę spakowania dodatkowego katalogu ze zdjęciem stworzonego przeze mnie.

Zaznaczam przy tym też opcje "export all output folders for checked projects"

0

Ja się nie użeram z Eclipsem. Tworzą wykonywalnego jara, który zawiera wszystkie niezbędne klasy, nadaję mu nazwę CoMiWDuszyGra.zip, kopiuję do tego zipa brakujące pliki graficzne i zmieniam nazwę na CoMiWDuszyGra.jar.

0

Ale w jaki sposób? Eclipse exportuje do .jar
Czyli jak? Po prostu bierzesz katalog z programem i pakujesz go archiwizerem do .zip a potem tylko zmieniasz mu rozszerzenie na .jar?

0

Eclipse eksportuje do .jar lub do .zip. Wybór należy do Ciebie.
jar.png
Po tym eksporcie mam w archiwum plik MANIFEST.MF oraz właściwie porozmieszczane w katalogach klasy. Archiwizerem tylko dopakowuje brakujące zasoby (np. pliki graficzne).

0

Niby, działa, ale nie wyświetla mi obrazka. Przypomniałem sobie o tej metodzie co podałeś mi wcześniej getSource(), ale zabij mnie nie potrafię jej wykorzystać -_-"
Kombinuję od dwóch godzin, wspomagam się dokumentacją Oracle i internetem, ale słabo to Idzie. Najpierw, próbowałem przerobić Klasę, która wcześniej wyświetlała mi ten obrazek czyli Zdjecie()(Mój pierwszy post), ale wyskakiwały błędy, więc postanowiłem stworzyć nową klasę i na niej kombinować.

 package CV;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.IOException;
import java.io.Serializable;

import javax.imageio.ImageIO;

public final class URL extends Object implements Serializable, ImageObserver {
	
	private BufferedImage image;
	
	public URL getResource() throws IOException{
		
		image=ImageIO.read(URL.class.getResource("Image/Ja.jpg"));
		return null;
		
		
	}
	public void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(image, 0, 0, this);
	

	}
	@Override
	public boolean imageUpdate(Image arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
		// TODO Auto-generated method stub
		return false;
	}
	public void setBounds(int i, int j, int k, int l) {
		// TODO Auto-generated method stub
		
	}
}

Ale nie dość, że to jest jakaś kaszana to i tak nie wyświetla obrazka już nawet w Eclipse.
Te wszystkie biblioteki, i masa (najpewniej) niepotrzebnych rzeczy jest wynikiem akceptacji sugestii żółtych kontrolek Eclipse.

0
package puchatek;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;

@SuppressWarnings("serial")
public class Test extends JFrame {

	public static void main(String[] args) {
		new Test();
	}
	public Test(){
		setTitle("Test");
		JPanel panel = new JPanel();
		panel.setPreferredSize(new Dimension(300,200));
		add(panel,BorderLayout.CENTER);
		JToolBar tb = new JToolBar();
		ImageIcon icon = new ImageIcon(Test.class.getResource("../images/Play.gif"));
		//lub tak
		//ImageIcon icon = new ImageIcon(Test.class.getResource("images/Play.gif"));
		tb.add(new JButton(icon));
		add(tb,BorderLayout.NORTH);
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
}

Powyższa wersja wymaga by katalog images był podkatalogiem katalogu projektu, alternatywna wymaga by images znajdował się obok pliku Test.class. Eksport do pliku jar zapisuje oba podkatalogi images.
project.png
Ważna uwaga, po "zewnętrznym" utworzeniu katalogu w środku katalogu projektu musisz (przed eksportem) odświeżyć projekt - klawisz F5.

0

Wielkie dzięki, działa.

Zauważyłem, że umieściłeś obrazek wewnątrz przycisku, który umieściłeś w toolbarze.
Nie ma możliwości wrzucić obrazka na "surowo"?
Kiedy próbowałem coś takiego wykonać to nie mogłem go dodać bo Eclipse krzyczał coś, że "add()" ma jakieś problemy z "icon". Oraz jaką funkcję pełni ta linijka: @SuppressWarnings("serial")?

0
  1. Nie można wrzucić obrazka na "surowo", ale można za pośrednictwem JLabeladd(new JLabel(icon));JLabel jest praktycznie niewidoczna.
  2. Instrukcja
@SuppressWarnings("serial")

jest mało istotna, pozwala uniknąć ostrzeżenia o braku pola serialVersionUID.

0

Wszystko już rozumiem, wszystko działa. Dzięki wielkie za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1