# Active Rendering im FSEM auf ein JPanel?



## Eich (12. Nov 2010)

Grüße,

Hier habe ich mal meinen Quelltext. Folgendes Problem. Ich habe einen Frame erzeugt welcher auf FSEM geschalten wird. Darein packe ich ein Canvas und in das Canvas (Hier mit dem Namen IFrame) zeichne ich ein Bild. So weit so gut. Doch auch nach langem probieren schaffe ich es nicht das Canvas auf dem Frame zu verschieben. Das Bild unter render() wird immer in der linken oberen Ecke gezeichnet egal wo ich das Canvas positioniere. In diesem Beispiel hat das Canvas die Position 100|100. Also müsste das Bild an Position 100|100 gezeichnet werden, tut es aber nicht es wird an Position 0|0 gezeichnet. Kann mir jemand sagen wieso oder wie ich dieses Problem lösen könnte?



```
import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;


public class Ike 
{

	public static void main(String[] args)
	{
		Fullscreen Role = new Fullscreen();
		Role.entrance();
	}

	

}

class Fullscreen implements Runnable
{
	private static final long serialVersionUID = 1L;
	
	GraphicsEnvironment Umwelt;
	GraphicsDevice Werkzeug;
	boolean halt = false;
	int i = 0;
	int x = 0;
	
	JFrame FullFrame = new JFrame();
	Canvas IFrame = new Canvas();
	
	BufferStrategy BSI;
	BufferedImage Karte;

	
	public void entrance() 
	{
		
 		
		FullFrame.setIgnoreRepaint(true);
		
		FullFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		FullFrame.setUndecorated(true);
		FullFrame.setResizable(false);
		
		FullFrame.add(IFrame);
 		FullFrame.setVisible(true);
 		
		Umwelt = GraphicsEnvironment.getLocalGraphicsEnvironment();
 		Werkzeug = Umwelt.getDefaultScreenDevice();
 		
 		Werkzeug.setFullScreenWindow(FullFrame);
		
 		
 		
 		IFrame.setIgnoreRepaint(true);
		IFrame.setVisible(true);
		IFrame.setSize(new Dimension(1000,500));
		IFrame.setLocation(100,100);
		IFrame.setFocusable(true);
		IFrame.requestFocus();
 		
		
		
		IFrame.createBufferStrategy(2);
		BSI = IFrame.getBufferStrategy();
		
 		System.out.println("Fullscreen CHECK.");

 		
 		
 		buffer();
		ini();
		
	}
	
	public void buffer()
	{
		

	}
	
	public void ini()
	{
	
		
		Thread Prozess = new Thread(this);
		Prozess.run();
	}
	
	public void run()
	{
		render();
			
			
		}
	}
	
	public void render()
	{
		
		x++;
		Graphics2D g = (Graphics2D)BSI.getDrawGraphics();
		
		g.drawImage(Karte,0,0,null);
		
		g.setColor(Color.red);
        g.drawString("Renderinglauf:" + x,50,50);
        
      
        BSI.show();
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
		
	}
	
	public void stop()
	{
		halt = true;
		System.exit(1);
	}
	
	
}
```


----------



## L-ectron-X (13. Nov 2010)

Das ist jetzt wahrscheinlich nicht die Lösung, aber du mischst da gerade Swing- und AWT-Komponenten.
Das solltest du vermeiden.
Verwende statt eines Canvas ein JPanel und überschreibe in der abgeleiteten Klasse die paintComponent()-Methode und setze dort hinein deine Zeichenanweisungen.


----------



## Eich (13. Nov 2010)

Ursprünglich wollte ich es ja auch mit einem JPanel machen allerdings bekomme ich das mit dem aktiven Rendern nicht wirklich richtig hin. Vllt kannst du mir ja dabei helfen. Ich habe jetzt folgendes eingefügt:


```
/* inner */ class PanelRenderClass extends JPanel
		{
		
				private static final long serialVersionUID = 1L;

				public void PanelRun()
				{
					repaint();
				}
				
				public void paint(Graphics g)
					{
					super.paintComponent(g);
					
					g.drawImage(Karte,0,0,null);
					g.dispose();
					}		
		}
```

Alles in allem scheint es nun zu funktionieren, aber ich bin mir nicht sicher ob ich das mit dem repaint() nicht lieber umgehen könnte. Irgendwelche Tips?


----------



## L-ectron-X (13. Nov 2010)

Schreibe dir eine Methode, der du von außen Werte eingeben kannst. Diese Werte speicherst du in Instanzvariablen, damit du sie in der paintComponent()-Methode zur Verfügung hast.

Zum Verschieben rufst du dann die setValue()-Methode mit den gewünschten Werten auf.

Deine Klasse zum Zeichnen als Canvas-Ersatz kann so aussehen:

```
class DrawPanel extends JPanel {
  private int x, y;
  
  public DrawPanel(Image picture) {
    setPicture(picture);
  }
  
  public void setPicture(Image picture) {
    this.picture = picture;
  }

  public void setValue(int x, int y) {
    this.x = x;
    this.y = y;
    repaint();
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(picture != null) {
    g.drawImage(picture, x, y, this);
  }
}
```


----------



## Eich (13. Nov 2010)

Sorry für den NinjaEdit aber meine Frage hatte sich leider schon geändert als du deine Antwort gegeben hast. Deinen Vorschlag werde ich sicherlich benutzen sobald ich sich bewegende Elemente einbringe. Momentan ging es mir aber vor allem darum das ganze statische drumherum zu realisieren.

Hier mal eine Skizze von meinem Plan:







Der Frame im FSEM added das rote und das grüne JPanel. Das Grüne wiederum added das Blaue JPanel. So habe ich einen Kartenausschnitt welchen ich durch setLocation verschieben kann und rechts daneben ein Menu.
Da dies quasi das erste Project ist welches ich mit Java programmiere bin ich in solchen Dingen etwas unerfahren. Das Problem ist das ich in diese ganzen JPanels nur passiv rendern kann. Oder gibt es eine Möglichkeit in die JPanels aktiv zu rendern (also ohne den repaint() Befehl) ? Wenn ja konnte ich bis jetzt noch nichts derartiges aufstöbern.

Der Grund wieso ich nicht aktiv auf den Frame im FSEM rendern kann ist das ich so die Weltkarte mit dem draw Befehl verschieben müsste. Dann könnte ich aber respektive nur umständlich Dinge auf die Karte malen da der Ort wo etwas anderes gezeichnet wird umgerechnet werden müsste.

Zeichne ich allerdings auf das blaue JPanel ist alles immer am rechten Fleck. Problem nur das auch die Offscreen Inhalte immer mitgerendert werden, richtig?

Deshalb bin ich der Meinung das die Lösung mit dem blauen JPanel die elegantere ist, allerdings bis jetzt ohne die Möglichkeit des aktiv renderns.


----------

