Program nie chce się uruchomić - błąd z AWT-EventQueue-0

0

Witam

Próbuje odpalić testowy program i mam następujące klasy

package obrazek;

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 ObrazPanel extends JPanel {

	private BufferedImage image;

	public ObrazPanel() {
		super();

		File imageFile = new File("java.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);
	}
}
package obrazek;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ObrazFrame extends JFrame {

	public ObrazFrame() {
		super("Program obrazkowy");

		JPanel obrazPanel = new ObrazPanel();
		add(obrazPanel);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
	}
}
package obrazek;

import java.awt.EventQueue;

public class Test {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				new ObrazFrame();
			}
		});
	}
}

I po próbie odpalenia wyskakują komunikaty

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
	The public type ObrazFrame must be defined in its own file

	at obrazek.ObrazFrame.<init>(ObrazPanel.java:6)
	at obrazek.Test$1.run(Test.java:10)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

W czym może być problem?

0

W jakim pliku masz definicję klasy ObrazFrame?

0

W pliku ObrazPanel.java

0

Znasz angielski? The public type ObrazFrame must be defined in its own file
Musisz tę definicję mieć w pliku ObrazFrame.java, taki jest wymóg dla klas publicznych.

0

Nadal błąd

ObrazFrame.java :

package obrazek;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ObrazFrame extends JFrame {

	public ObrazFrame() {
		super("Program obrazkowy");

		JPanel ObrazFrame = new ObrazFrame();
		add(ObrazFrame);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setVisible(true);
	}
}
Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem: 
	Type mismatch: cannot convert from ObrazFrame to JPanel

	at obrazek.ObrazFrame.<init>(ObrazFrame.java:11)
	at obrazek.Test$1.run(Test.java:10)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
 

A jak poprawie tak jak program chce z

JPanel ObrazFrame = new ObrazFrame();

na ObrazFrame ObrazFrame = new ObrazFrame();


to jest błąd

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Unknown Source)
at java.awt.Window.init(Unknown Source)
at java.awt.Window.<init>(Unknown Source)
at java.awt.Frame.<init>(Unknown Source)
at javax.swing.JFrame.<init>(Unknown Source)
at obrazek.ObrazFrame.<init>(ObrazFrame.java:9)
at obrazek.ObrazFrame.<init>(ObrazFrame.java:11)
at obrazek.ObrazFrame.<init>(ObrazFrame.java:11)

0

Pewnie dlatego, że tworzysz nowy obiekt ObrazFrame w jego własnym konstruktorze, co błyskawicznie zapycha stos.

0

Czy da się to jakoś naprawić?

Chodzi konkretnie o tą linijkę?

ObrazFrame ObrazFrame = new ObrazFrame();
0

Zamień instancję ObrazFrame na ObrazPanel.

0

Zmieniłem na

		JPanel ObrazFrame = new ObrazekPanel();
		add(ObrazekPanel);

ale ciągle jakieś błędy.

Przykład wziąłem z http://javastart.pl/static/grafika_awt_swing/pobieranie-i-wyswietlanie-obrazow/

0

Skoro przerasta Cię skopiowanie kodu to nie wróżę Ci sukcesów, . Skopiuj z podanej strony kody i umieść w trzech plikach: Test.java, ObrazFrame.java i ObrazPanel.java. Jak nie poradzisz sobie z błędem - brak pliku java.jpg - to napisz kolejny post.

0

Kod skopiowałem prawidłowo tylko nie zadziałał dlatego zacząłem kombinować. Teraz kod jest skopiowany 1:1 i wrzuciłem plik java.jpg do workspace/nazwaprojektu i nadal nie działa. Może problem jest w skrypcie. W klasie ramki występuje błąd w tej linijce

 JPanel obrazPanel = new ObrazPanel();
Blad odczytu obrazka
javax.imageio.IIOException: Can't read input file!
	at javax.imageio.ImageIO.read(Unknown Source)
	at obrazek.ObrazekPanel.<init>(ObrazekPanel.java:20)
	at obrazek.ObrazFrame.<init>(ObrazFrame.java:15)
	at obrazek.Test$1.run(Test.java:10)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at obrazek.ObrazekPanel.<init>(ObrazekPanel.java:26)
	at obrazek.ObrazFrame.<init>(ObrazFrame.java:15)
	at obrazek.Test$1.run(Test.java:10)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source) 
1
  1. Błąd jest w tym wierszu:
image = ImageIO.read(imageFile);

a nie w tym, który podałeś.
2. Chyba jednak zmieniłeś kod, w oryginale nie ma instrukcji

package obrazek;
  1. Jak uruchamiasz, w IDE czy z konsoli? To jest ważna różnica, jeśli plik graficzny opisujesz tak
File imageFile = new File("java.jpg");

to JVM szuka tego pliku w katalogu bieżącym. Jeśli uruchamiasz w IDE, to katalogiem bieżącym jest katalog projektu, jeśli uruchamiasz z konsoli, to katalog bieżący wyświetla się w tejże konsoli.

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