Hi,
ich könnt da mal eure Hilfe brauchen, ich habe mir ein DrawPanel gebastelt, welches Grafiken wahlweise von der Festplatte einlesen bzw. von einem externen Prozess generieren soll.
Das Problem ist, das es erst allen Grafiken einliest und danach neu zeichnet, das soll es aber nicht, es soll auch mittendrin mal neu zeichnen (weil der externe Prozess doch teilweise sehr lange dauert).
gruss.
kosch
ich könnt da mal eure Hilfe brauchen, ich habe mir ein DrawPanel gebastelt, welches Grafiken wahlweise von der Festplatte einlesen bzw. von einem externen Prozess generieren soll.
Das Problem ist, das es erst allen Grafiken einliest und danach neu zeichnet, das soll es aber nicht, es soll auch mittendrin mal neu zeichnen (weil der externe Prozess doch teilweise sehr lange dauert).
gruss.
kosch
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import videoextention.ImageGenerator;
import videoextention.Timecode;
import videoextention.Videofile;
public class AnotherTestGUI extends JFrame {
public AnotherTestGUI() {
super();
PicturePanel pp = new PicturePanel();
JScrollPane sp = new JScrollPane(pp);
this.getContentPane().add(sp);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setSize(400, 500);
this.setVisible(true);
pp.setVideofile(new Videofile("/home/momo/Videos/otrkey/Eine_Videodatei.avi"));
}
class PicturePanel extends JPanel {
File tempdirectory = new File("/home/momo/Videos/otrkey/large/");
private Videofile videofile;
private BufferedImage offscreenImage;
public PicturePanel() {
super();
}
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
if (offscreenImage != null) {
size.width = offscreenImage.getWidth(this);
size.height = offscreenImage.getHeight(this);
}
return size;
}
public void setVideofile(Videofile input) {
this.videofile = input;
offscreenpaint();
repaint();
}
private BufferedImage nextImage(Timecode nextTimecode) {
System.out.println("Hole Image : " + tempdirectory.getAbsolutePath() + nextTimecode.getTimetoString() + ".png");
File nextImageFile = new File(tempdirectory.getAbsolutePath(), nextTimecode.getTimetoString() + ".png");
if(! nextImageFile.exists()){
ImageGenerator ig = new ImageGenerator();
String decoder = new String("ffmpeg");
ig.setDecoder(decoder);
ig.setTempdirectory(tempdirectory);
ig.generateThumbnail(videofile, nextTimecode);
repaint();
}
BufferedImage nextImage = null;
try {
nextImage = ImageIO.read(nextImageFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return nextImage;
}
private void offscreenpaint() {
Timecode starttimecode = new Timecode("0:0:25.000");
Timecode endtimecode = new Timecode(videofile.getLaenge().getSecond());
for (float i=starttimecode.getSecond(); i<endtimecode.getSecond(); i+=ImageGenerator.MINUTE){
if (i > 0 && i < videofile.getLaenge().getSecond()) {
BufferedImage oldscreenImage = offscreenImage;
BufferedImage tempImage = this.nextImage(new Timecode(i));
if (oldscreenImage == null) {
offscreenImage = new BufferedImage(tempImage.getWidth(), tempImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D offscreenGraphics = offscreenImage.createGraphics();
offscreenGraphics.drawImage(tempImage, 0, 0, this);
}
else {
offscreenImage = new BufferedImage(oldscreenImage.getWidth() + tempImage.getWidth(), oldscreenImage.getHeight() + tempImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D offscreenGraphics = offscreenImage.createGraphics();
offscreenGraphics.drawImage(oldscreenImage, 0, 0, this);
offscreenGraphics.drawImage(tempImage, oldscreenImage.getWidth(), 0, this);
}
}
repaint();
}
}
protected void paintComponent(Graphics g) {
super.paintComponent (g); //immer erst Aufrufen
System.out.println("Repaint");
if ( offscreenImage != null )
g.drawImage(offscreenImage, 0, 0, this);
}
}
}