amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Java: JLabel Bild Refreshen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

23.02.2006, 13:39 Uhr

eliotmc
Posts: 925
Nutzer
Hallo,

ich lese mit einem Programm das aktuelle Bild von
einer WebCam aus und möchte dieses dann in einem JLabel darstellen.
Das Auslesen läuft soweit, nur wie kann ich den JLabel neu
zeichen, bzw. nen anderes Bild übergeben???

Hier mal nen bissel Code von der betreffenden Klasse:

package ***;

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import ***webcam.*;


public class GetPicGui extends JFrame implements ActionListener{


public GetPicGui(){
super("Grabb Picture");
JPanel panel = new JPanel();
JButton button = new JButton("refresh");
button.addActionListener(this);
ImageIcon icon = new ImageIcon("***grabbed/pic.jpg");
JLabel label = new JLabel(icon);
panel.add(button);
panel.add(label);
getContentPane().add(panel);
}

public void actionPerformed(ActionEvent event){
String cmd = event.getActionCommand();
if(cmd.equals("refresh")){
Webcam.GetPic();
//????
}
}

public static void Start(){

GetPicGui frame = new GetPicGui();
frame.setLocation(100, 100);
Dimension dim = new Dimension(150,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(dim);
frame.pack();
frame.setVisible(true);
}
}

in actionPerformed muss ich das irgendwie regeln, nur wie???
--
regards

eliot

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 14:04 Uhr

eliotmc
Posts: 925
Nutzer
Ich geb mal selbst die Antwort :)

public void actionPerformed(ActionEvent event){
String cmd = event.getActionCommand();
if(cmd.equals("refresh")){
Webcam.GetPic();
icon = new ImageIcon("***.jpg");
label.setIcon(icon);
label.repaint();
}
}
--
regards

eliot

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 17:34 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
Java code:
public void actionPerformed(ActionEvent event){
		String cmd = event.getActionCommand();
		if(cmd.equals("refresh")){
			Webcam.GetPic();
			icon = new ImageIcon("***.jpg");
			label.setIcon(icon);
			label.repaint();
		}
	}



Du brauchst kein repaint(). Wenn Du setIcon() aufrufst und das icon ein anderes als vorher ist, dann wird automatisch repaint() aufgerufen.
(Wenn es kein anderes als vorher ist, dann bauchst Du kein setIcon()...)

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 18:14 Uhr

eliotmc
Posts: 925
Nutzer
@Holger:

Hmm,

ich hatte es wie oben geschrieben ausprobiert. Mit 2 verschiedenen
Images hat das auch funktioniert. Jetzt habe ich gerade die WbCam
bekommen, und da greife ich natürlich immer auf das gleiche Image zu.
Allerdings bewirkt mein Event dann nix mehr -> Das bild wird
nicht neu gezeichnet :(

public void actionPerformed(ActionEvent event){
String cmd = event.getActionCommand();
if(cmd.equals("refresh")){
Webcam.GetPic();
icon = new ImageIcon("***/pic.jpg");
// label.setIcon(icon);
label.repaint();
}
}

komisch?!

PS Der Download des Bildes funktioniert,
es leigt also wirklich am damn JLabel :(
--
regards

eliot

[ Dieser Beitrag wurde von eliotmc am 23.02.2006 um 18:27 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 19:28 Uhr

eliotmc
Posts: 925
Nutzer
Und noch nen Problem mit Swing:
Java code:
public GetPicGui(){
		super("Grabb Picture");
		Container cp = getContentPane();
		JPanel panel = new JPanel();
		JButton button = new JButton("refresh");
		button.addActionListener(this);
		button.setMaximumSize(new Dimension(200,20));
		button.setMinimumSize(new Dimension(200,20));
		button.setSize(200,20);
		Webcam.GetPic();
		icon = new ImageIcon("***/pic.jpg");
		label = new JLabel(icon);
		panel.add(button);
		panel.add(label);
		cp.add(panel);
	}


button.setMaximumSize, button.setMinimumSize, button.setSize
beiben ohn eWirkung, egal was ich eintrage, der Button wird
immer gleich groß gezeichnet :(
Swing ist irgendwie sehr eigenwillig, ...
--
regards

eliot

[ Dieser Beitrag wurde von eliotmc am 23.02.2006 um 19:28 Uhr geändert. ]

[ Dieser Beitrag wurde von eliotmc am 23.02.2006 um 19:30 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 19:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
Jetzt habe ich gerade die WbCam
bekommen, und da greife ich natürlich immer auf das gleiche Image zu.
Allerdings bewirkt mein Event dann nix mehr -> Das bild wird
nicht neu gezeichnet :(
code:
public void actionPerformed(ActionEvent event){
		String cmd = event.getActionCommand();
		if(cmd.equals("refresh")){
			Webcam.GetPic();
			icon = new ImageIcon("***/pic.jpg");
		//	label.setIcon(icon);
			label.repaint();
		}
	}


icon ist doch ein anderes Icon, im Sinne eines Objekts, wenn Du new benutzt. Das heißt, repaint() wird dann auch aufgerufen, wenn Du setIcon() aufrufst.

Allerdings wird auch dann das Bild über java.awt.Toolkit.getImage() geladen, egal ob Du einen String oder eine URL übergibst. Und diese Funktion kann die Daten cachen, daß heißt, auch wenn die Datei ein neues Bild enthält, bekommst Du das alte.
Du mußt das Bild über java.awt.Toolkit.createImage() laden und dann an's ImageIcon übergeben, wenn Du sicher sein willst.
code:
public void actionPerformed(ActionEvent event){
	Webcam.GetPic();
	icon = new ImageIcon(Toolkit.createImage("***/pic.jpg"));
	label.setIcon(icon);
}

Die Abfrage des action command kannst Du Dir dabei sparen. Es ist nicht empfehlenswert, einen listener für verschiedene Aufgaben zu benutzen. Und wenn jeder listener genau eine Aufgabe hat, braucht man keine Fallunterscheidungen.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 19:37 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
button.setMaximumSize, button.setMinimumSize, button.setSize
beiben ohn eWirkung, egal was ich eintrage, der Button wird
immer gleich groß gezeichnet :(
Swing ist irgendwie sehr eigenwillig, ...


Eigentlich nicht. Du mußt Dich zuerst fragen, welche Wirkung Du erzielen willst, welcher LayoutManager aktiv ist, bzw. welchen Du am Besten verwenden solltest und wie der wirkt, natürlich.

Du erzeugst ein Panel ohne Parameter, d.h. Du verwendest FlowLayout. Das benutzt ausschließlich preferredSize. Allerdings ist die Frage, ob der Algorithmus von FlowLayout überhaupt dem entspricht, was Du erreichen willst. Das ist gerade bei diesem LayoutManager sehr selten der Fall.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ Dieser Beitrag wurde von Holger am 23.02.2006 um 19:42 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 20:11 Uhr

eliotmc
Posts: 925
Nutzer
@Holger:

Naja, ich habe es auch schon mit GridLayout probiert,
funktioniert auch, jedoch wird der Button dann genau so großt gemacht
wie das Bild draunter (die angegebenen Größen werden auch da
einfach ignoriert). Wenn ich eine Größe setze, dann sollte
das auch so sein, ungeachtet dessen, was der Layout Manager
sagt. Warum sollte dieser auch was gegen die angegeben Größen haben?

Zum Thema davor (ist auch viel wichigter für mich :) ),
was du mir sagen willst, ist mir jetzt klar, nur wie erwzinge
ich denn jetzt ein Neuladen des Bildes? Vor allem brauche ich
ja ein IconImage und kein Image?!
JAVA code:
Image img = getToolkit().getImage("d***/pic.jpg");
			label.setIcon(img);




--
regards

eliot

[ Dieser Beitrag wurde von eliotmc am 23.02.2006 um 20:17 Uhr geändert. ]

[ Dieser Beitrag wurde von eliotmc am 23.02.2006 um 20:18 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 21:33 Uhr

eliotmc
Posts: 925
Nutzer
Versuch macht klug :)
JAVA code:
public void actionPerformed(ActionEvent event){
		String cmd = event.getActionCommand();
		if(cmd.equals("refresh")){
			Webcam.GetPic();
			img = getToolkit().createImage("***/pic.jpg");
			icon.setImage(img);
			label.repaint();
		}
	}


Danke Holger!!!
--
regards

eliot

[ - Antworten - Zitieren - Direktlink - ]

23.02.2006, 22:44 Uhr

eliotmc
Posts: 925
Nutzer
Hmm, jetzt wirds nochmal richtig krass :(

Gibt bestimmt auch einen Weg das Bild zu drehen???
Igendeinen Hint für sowas???
--
regards

eliot

[ - Antworten - Zitieren - Direktlink - ]

24.02.2006, 16:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
@Holger:

Naja, ich habe es auch schon mit GridLayout probiert,
funktioniert auch, jedoch wird der Button dann genau so großt gemacht
wie das Bild draunter (die angegebenen Größen werden auch da
einfach ignoriert). Wenn ich eine Größe setze, dann sollte
das auch so sein, ungeachtet dessen, was der Layout Manager
sagt. Warum sollte dieser auch was gegen die angegeben Größen haben?

Kann es sein, daß Du überhaupt keine Anung hast, wie ein LayoutManager funktioniert?

Wenn Du ein bestimmtes Layout haben willst, beschreibe doch erst einmal, wie es aussehen soll. Aus den bisherigen Schnipseln kann man das nicht erraten.

Wenn erst mal klar ist, wie es hinterher aussehen soll, kann man Dir auch dabei helfen, dieses Ziel zu erreichen.
Zitat:
Zum Thema davor (ist auch viel wichigter für mich :) ),
was du mir sagen willst, ist mir jetzt klar, nur wie erwzinge
ich denn jetzt ein Neuladen des Bildes? Vor allem brauche ich
ja ein IconImage und kein Image?!

Hä?
Ich habe Dir doch Beispielcode gepostet...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.02.2006, 17:12 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
Gibt bestimmt auch einen Weg das Bild zu drehen???
Igendeinen Hint für sowas???

Zwei Möglichkeiten. Je nachdem, ob es sich um ein beliebiges Toolkit-Image oder bereits um ein BufferedImage handelt.
code:
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.*;

public class ImgTest
{
  static Image rotate(Image img, int angle, int centerX, int centerY)
  {
    double theta=angle*Math.PI/180;
    AffineTransformOp op = new AffineTransformOp(
        AffineTransform.getRotateInstance(theta, centerX, centerY),
        AffineTransformOp.TYPE_BILINEAR);
    return Toolkit.getDefaultToolkit().createImage(
      new FilteredImageSource(img.getSource(), new BufferedImageFilter(op)));
  }

  static BufferedImage rotate(BufferedImage img, int angle, int centerX, int centerY)
  {
    double theta=angle*Math.PI/180;
    AffineTransformOp op = new AffineTransformOp(
        AffineTransform.getRotateInstance(theta, centerX, centerY),
        AffineTransformOp.TYPE_BILINEAR);
    return op.filter(img, null);
  }
}


mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

28.02.2006, 12:37 Uhr

eliotmc
Posts: 925
Nutzer
@Holger:

Danke, das funktioniert auch prima.
Allerdings habe ch noch eine Frage:
Ich will ein Bild vom Format 320x240 drehen, wie
sollten dann centerX und centerY aussehen???
Die Werte sollen doch angeben, um welchen Punkt gedreht werden soll?!
also, wäre die Richtige Angabe wohl 160x120???

regards

eliot
--
regards

eliot

[ Dieser Beitrag wurde von eliotmc am 28.02.2006 um 12:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.02.2006, 16:42 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von eliotmc:
Ich will ein Bild vom Format 320x240 drehen, wie
sollten dann centerX und centerY aussehen???
Die Werte sollen doch angeben, um welchen Punkt gedreht werden soll?!
also, wäre die Richtige Angabe wohl 160x120???


Richtig, der häufigste Fall wird wohl Drehen um den Mittelpunkt sein. Wenn man ein BufferedImage hat, kann man natürlich einfach nach der Größe fragen und diese halbieren. Wenn man ein toolkit Image hat (also eines, das von java.awt.Toolkit zurückgegeben wird), dann geht das nicht so einfach, weil das Bild asynchron geladen wird, und diese Information evtl. noch nicht zur Verfügung steht.
Das war mir dann zu kompliziert in der Programmierung, deshalb habe ich einen Parameter daraus gemacht.

Fall Du wissen willst, wie man am schnellsten ein BufferedImage bekommt (in vielerlei Hinsicht einfacher zu handhaben):

(ab Java1.4)

javax.imageio.ImageIO.read(...)

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Java: JLabel Bild Refreshen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.