# Repaint auf JFrame, JLabel und ImageIcon



## Bitstubbi (7. Feb 2013)

Hallo zusammen,
ich habe ein programm geschrieben, was in einem JFrame einen aktuellen Screenshot anzeigen soll. 
Der Sinn dieses Programmes sei jetzt mal dahin gestellt  in meiner Capture Klasse nehme ich einen Bild auf und in meiner Gui Klasse für ich dies in ein ImageIcon ein, welches in einem JLabel angezeigt wird. Die Gui erneuert sich dank Thread alle 4 sekunden. Jedoch zeigt sich die reapint methode ohne Funktion  

Bitte helft mir sufu sagt flush benutzen, Graphics.drawImage benutzen hat aber beides nicht funktioniert.

Grüße 


```
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Gui implements Runnable{

	private JFrame window;
	private BufferedImage screen;
	private JLabel imBox;
	private void doInit(){
		window=new JFrame("Capture");
		window.setVisible(true);
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.setLayout(new GridBagLayout());
		GridBagConstraints eins=new GridBagConstraints();
		eins.gridx=0;
		eins.gridy=0;
		refreshGui();
		window.add(imBox,eins);
		window.setSize(c.screenDimension);
	}

	private Capture c;
	
	private Gui(){
		doInit();
		Thread t = new Thread(this);
		t.start();
	}
	
	public void run() {
		while(window.isVisible()){
		try {
			Thread.sleep(4000);
			refreshGui();
		} catch (InterruptedException e) {
			e.printStackTrace();
			}
		}
	}

	private void refreshGui() {
		c = new Capture() ;
		screen = c.getScreen();
		ImageIcon icon = new ImageIcon(screen); 
        imBox = new JLabel(icon); 
        imBox.setSize(c.screenDimension);
        imBox.repaint();
		window.repaint();
        System.out.println("refresh ");		
	}
	
	public static void main(String[]args){
		new Gui();
	}
}
```


```
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;


public class Capture {
	
	private BufferedImage screen;
	private Rectangle captureSize;
	private Robot robot;
	public Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
	
	public Capture(){
		captureScreen();
		System.out.print("  new Object");
	}

	private void captureScreen(){
	try {
        robot = new Robot();
        captureSize = new Rectangle(0, 0, screenDimension.width,
        								  screenDimension.height);
        screen = robot.createScreenCapture(captureSize);
    }
    catch(AWTException e) {
    	System.err.println("Something fishy is going on...");
    }
	}

	public BufferedImage getScreen() {
		System.out.print(" new capture  ");
		return screen;
	}

	public void setScreen(BufferedImage scr) {
		screen = scr;
	}
	
}
```


----------



## SlaterB (8. Feb 2013)

du erzeugst ein neues JLabel, in die GUI eingefügt ist aber nur das erste JLabel,
was sich in deinem Instanzattribut tut ist für die GUI ohne Belang (also Neuzuweisung),

JLabel austauschen ist eh mühsam, nicht zu empfehlen,
setze das Icon per set-Methode im ersten JLabel


----------



## Bitstubbi (8. Feb 2013)

SlaterB hat gesagt.:


> ,
> setze das Icon per set-Methode im ersten JLabel



Dickes Danke klingt sehr logisch :idea: werde es daheim direkt aufprobieren  

Also eine neue Set-methode in dem das icon in das label gesetzt wird?


----------



## SlaterB (9. Feb 2013)

eine Methode von JLabel, die gibts schon, das kannst du nicht programmieren


----------



## Bitstubbi (9. Feb 2013)

Habs nun


----------

