JInternalFrame wird überzeichnet

Vogi

Aktives Mitglied
Hallo,

ich habe ein JWindow mit einem JInternalframe. Das Problem ist nun, dass ich im JWindow zeichnen möchte, und immer wenn ich im Window zeichne wird das JInternalFrame überzeichnet. Daher zeichne ich bei jedem neuzeichnen des JWindows nun auch das JInternalFrame neu, nun flckert aber alles. Kann mir irgendjemand helfen, damit ich das Flackern wegbekomme?

Hier mein Programmcode:

Die Klasse MeinWindow:

Java:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferStrategy;

import javax.swing.JDesktopPane;
import javax.swing.JWindow;

public class MeinWindow extends JWindow{
	public JDesktopPane d = new JDesktopPane();
	static MyInternalFrame f;
	BufferStrategy myStrategy;

	public MeinWindow() {
    	setContentPane(d);
    	GraphicsDevice device;
        device=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        device.setFullScreenWindow(this); 
        Rendering renderer = new Rendering(this);
        createBufferStrategy(2);
    	myStrategy = getBufferStrategy();
		renderer.start();	
    }
    
    public void rendering() {
		Graphics g = myStrategy.getDrawGraphics();
		render(g);
		g.dispose();
		myStrategy.show();
		
	}
    
    public void render(Graphics g){
    	g.setColor(Color.yellow);
    	g.fillRect(0, 0,getWidth(),getHeight());
    	if(f != null){
        	f.repaint();
    	}
    }
    
    public static void main(String[] args) {
        MeinWindow frame = new MeinWindow();
        try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		frame.setLayout(new FlowLayout());
		f = new MyInternalFrame();
        frame.d.add(f);
    }
}



Die Klasse MyInternalFrame:

Java:
import java.beans.PropertyVetoException;

import javax.swing.JButton;
import javax.swing.JInternalFrame;


public class MyInternalFrame extends JInternalFrame {
	public MyInternalFrame() {
      add(new JButton("Button"));
      setSize(10,10);
      setVisible(true);
      try {
		setSelected(true);
      } catch (PropertyVetoException e) {
    	  e.printStackTrace();
      }
    }
}

Die Klasse Rendering:

Java:
public class Rendering extends Thread {
	private MeinWindow anzeige;
	
	public Rendering(MeinWindow a){
		anzeige = a;
	}
	
	public void run(){
		while(true){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			anzeige.rendering();
		}
		
	}
}

PS : Ich benutze den Vollbildmodus, da daraus später ein Spiel werden soll.
 
Bist du sicher, dass InternalFrames das richtige für ein Spiel sind?
Des weiteren solltest du vll nicht alle 100 MS neuzeichnen, da das doch sehr ineffizeint ist. Wenn du so oft neuzeichnen musst ist Swing sicher nicht der richtige Ansatz.
 
was soll ich den sonst für das spiel nehmen? das spiel besteht aus 64 feldern und wenn man auf eines draufdrückt, soll sich ein menü öffnen, und ich dachte ,dass ich dass am besten mit einem InternalFrame mache. Das mit dem alle 100ms neuzeichnen muss nicht sein, 500 ms würden wohl auch noch gehen, aber es flackert dann trotzdem noch. es muss doch da irgendeine Möglichkeit geben, dass das InternalFrame beim Neuzeichnen des Windows nicht überzeichnet wird.

Ach und warum kein Swing? Ist AWT bei schnellem neuzeichnen besser?
 
Zuletzt bearbeitet:
Leider beides relativ langsam, da diese CPU-Gerendert werden.

Evtl könnte Slick was für dich sein, dieses ist beim zeichnen erheblich scheller
 
Double Buffering könnte helfen.

Zuerst alle Zeichneoperationen auf ein Image-Objekt ausführen und dann erst zeichnen.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben