Grafik anzeigen

Moin,

ich werde einfach mit der GUI von Java nicht richtig warm :twisted:

import javax.imageio.*;

import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;

public class Program extends JFrame {
	
	public static void main(String[] args) {
		new Program();
	}
	
	private Program() {
		super("WLANCam");
		setLayout(new BorderLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setBounds(0, 0, 640, 400);
		setLocationRelativeTo(null);
		
		timer = new Timer(500, new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				downloadImage();
			}
		});
		timer.start();
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				timer.stop();
			}
		});
		panel = new ImagePanel(this);
		add(panel, BorderLayout.CENTER);
		
		setVisible(true);
	}
	
	private Image image = null;
	private Timer timer = null;
	private ImagePanel panel = null;

	private void downloadImage() {
		try {
			URL url = new URL("http://192.168.253.250/snapshot.cgi?user=admin&pwd=");
			image = ImageIO.read(url);
			panel.setImage(image);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	class ImagePanel extends JLabel {
		private Image image;
		private JFrame parent;
		public ImagePanel(JFrame parent) {
			this.parent = parent;
		}
		public void setImage(Image image) {
			this.image = image;
			repaint();
		}
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(image, parent.getWidth(), parent.getHeight(), this);
			g.drawLine(0, 0, parent.getWidth(), parent.getHeight());
		}
	}
	
}

Kann mal bitte jemand drüber schauen und mir sagen wo mein Fehler liegt?

danke, mogel

[quote=mogel]“http://192.168.253.250/snapshot.cgi?user=admin&pwd=”[/quote]wenn da wirklich ein Passwort erwartet wird bekommst Du als Antwort kein Bild, sondern ein 404-Error Meldung.

Bye
TT

ist wirklich etwas knapp alles geraten, wird das Bild von URL geladen?
besser lokales Bild testen

der aktuelle Zeichenbefehl malt das Bild rechts unten außerhalb des Panels,
gemeint ist bestimmt:
g.drawImage(image, 0, 0, parent.getWidth(), parent.getHeight(), this);

lieber auch nur auf das eigene JPanel achten, bestimmt paar Pixel weniger breit und hoch, besonders Header,
sieht man ja an der Linie, die nicht genau unten rechts die Ecke trifft

stimmt - hätte ich noch hinschreiben können. Hatte entsprechend auch alles nochmal geprüft. Zwischendurch war wirklich die Kamera abgestorben.

nööö - da ist kein Passwort

Wald und Bäume und so :idea: das war das Problem.

[quote=SlaterB;115546]lieber auch nur auf das eigene JPanel achten, bestimmt paar Pixel weniger breit und hoch, besonders Header,
sieht man ja an der Linie, die nicht genau unten rechts die Ecke trifft[/quote]
es reicht um meine Kinder zu beobachten, wer Dummheiten macht beim Einschlafen. Über die Weboberfläche ist das hier irgend „komisch“. Da flackern irgend wann sämtliche Wiedergaben (Steam/Kodi/Youtube/…), daher ein eigenes kleines Etwas.

Naja, auch wenn der Code sicher das tut was er soll ist er doch recht unschön.
z.B. hättest du dir selbst-zeichnen sparen können, denn einem JLabel kann man direkt ein Icon (z.B. ImageIcon mit URL) übergeben was dann gezeichnet wird, source dazu sieht so aus:
JLabel imageLabel=new JLabel(new ImageIcon(<URL>));
fertig wäre gewesen und du hättest das gewünschte Ergebnis erhalten.
Auch ist halt der Name unpassend : ImagePanel extends JLabel … sehr fragwürdig.
Und zu extends JFrame gibts ja einen schönen wiki-Eintrag.

Soll jetzt kein böses “auf die Finger klopfen” sein, so lange der Code das tut was er soll ist ja ok, aber “sauber” ist doch anders.

stimmt - das sind noch die überbleibsel auf der Suche nach dem Fehler, war vorher in der Tat ein JPanell

ich erweitere das JFrame um meine Funktionalitäten :smiley:

schaue ich mir mal an - kannte ich noch nicht

Ein paar Sachen dazu kannst du auch im Wiki nachlesen: Grafikdateien laden und anzeigen (Java)

Dem würde ich so direkt erstmal widersprechen, da mir nicht ganz klar wird um welche.
Gehen wir mal die Zeilen durch:

  • du setzt einen Titel
  • du setzt ein Layout
  • du setzt eine Standardaktion beim Schließen des Fensters
  • du setzt eine Größe
  • du setzt eine Position
  • du baust einen Timer zusammen und startest diesen (der an dieser Stelle im Konstruktor (IMO) nichts verloren hat)
  • du fügst einen Listener hinzu
  • du fügst eine Component hinzu
  • du machst es sichtbar
    Sorry, aber ich kann nicht erkennen wo du jetzt die Grundfunktionalität erweiterst oder grundlegend änderst.

Kein Problem. Dafür ja der Hinweis.