DragAndDrop-Waypoints bewegen, ABER Bildschirm flackert

Status
Nicht offen für weitere Antworten.

MisterDan

Mitglied
Hallo zusammen,

ich habe ein DrawPanel. Wenn man mit der Maus darauf klickt wird ein Waypoint erstellt und an die Mausposition gesetzt.
Die Klasse Waypoint erbt aber nicht von Component wie man es jetzt erwarten würde.
Ein Waypoint besteht quasi nur aus einer X,Y-Position, einem Radius und einer ID.
Die Waypoints werden beim erstellen in einen Vektor geschreiben und der draw-Methode im drawPanel wird gesagt, das sie sich den Vektor holen soll und dementsprechend Kreise zeichnen soll. (g2d.drawOval(....))

Nun möchte ich diesen Kreis mit der Maus "anfassen" und hin und her schieben.

Hab das auch qausi alles hingekriegt nur dass während ich einen Waypoint verschiebe, der Bildschirm total am Flackern ist.
Kann mir jemand sagen wie ich das beheben kann?

Mfg

MisterDan
 
ok, dann hier mal die entsprechende DrawPanel klasse!
In dieser Klasse wird gezeichnet.

Code:
package local.gui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Iterator;

import javax.swing.JPanel;

import local.persistance.mapLoader.TileMap;

/**
 * 
 * 		@author
 * 		Daniel Lüers
 */
@SuppressWarnings("serial")
public class DrawPanel extends JPanel {

    private boolean mouseEvent;
    private boolean mapLoaded;
    private int x;
    private int y;
    private Font wpOuterFont;
    private Font wpInnerFont;
    private Font cFont;
    private Color wpInnerFontColor;
    private Color wpOuterFontColor;
    private Color waypointColor;
    private Color connectionColor;
    private TileMap tileMap;
    private WPEditorController wpController;
    
	public DrawPanel(final WPEditorController wpController){
		
		this.wpController = wpController;
		this.wpOuterFont = new Font("SansSerif", Font.BOLD, 15); 
		this.wpInnerFont = new Font("SansSerif", Font.TYPE1_FONT,  12); 
		this.cFont = new Font("SansSerif", Font.PLAIN, 9);
		this.waypointColor = new Color(51,102,153);
		this.connectionColor = new Color(51,102,153);
		this.wpInnerFontColor = new Color(255, 255, 255);
		this.wpOuterFontColor = new Color(0,0,0);
		this.mouseEvent = false;
		this.mapLoaded = false;
		this.addMouseListener(new MouseAdapter(){
			public void mouseClicked(MouseEvent event){	
				x = event.getX();
				y = event.getY();
				mouseEvent = true;
				wpController.doLogic(x, y);
			}
		});
		this.addMouseMotionListener(new MouseMotionListener(){

			public void mouseDragged(MouseEvent event) {
				Waypoint selectedWaypoint = wpController.getWaypointByPosition(event.getX(), event.getY());
				if(selectedWaypoint != null){
					wpController.moveWaypoint(selectedWaypoint.getWaypointID(), event.getX(), event.getY());
				}				
			}
			
			public void mouseMoved(MouseEvent arg0) {}
			
		});
	}
	
	public void updateUserInterface(){
		Graphics g = getGraphics();
		if (g != null)
			redrawGraphics(g);
	}
	
	public void updateUserInterface(boolean clearScreen){
		Graphics g = getGraphics();
		if (g != null)
			redrawGraphics(g, clearScreen);		
	}
	
	public void paintComponent(Graphics g){
		redrawGraphics(g);
	}
	
	private void redrawGraphics(Graphics g, boolean clearScreen){
		Graphics2D g2 = (Graphics2D) g;
		//Screen erneuern
		g2.setColor(Color.gray);
		g2.fillRect(0,0,getWidth(), getHeight());
	}
	
	private void redrawGraphics(Graphics g){
		//initialize Antialiasing
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		if(!mouseEvent){
			//Screen erneuern
			if(!mapLoaded){
				g2.setColor(Color.gray);
				g2.fillRect(0,0,getWidth(), getHeight());
			}
			//Map neu zeichnen
			if(mapLoaded){
				tileMap.draw(g2);
				if(wpController.getShowWireFrame()){
				createWireFrame(wpController.getDrawPanelDimension().width,
						wpController.getDrawPanelDimension().height, wpController.getWireFramesize(), g2);
				}
			}
		}
		
		Iterator<Connection> cIter = wpController.getCList().values().iterator();
		while(cIter.hasNext()){
			Connection c = cIter.next();
			
			g2.setColor(connectionColor);
			g2.setStroke(new BasicStroke(4.0f));
			g2.drawLine(c.getStartX(), c.getStartY(), c.getEndX(), c.getEndY());
			
			int middleX = calculateMiddlePointX(c.getStartX(), c.getEndX());
			int middleY = calculateMiddlePointY(c.getStartY(), c.getEndY());
			
			g2.setColor(connectionColor);
			g2.fillOval(middleX-5, middleY-15, 30, 40);
			g2.setColor(Color.white);
			g2.setFont(cFont);
			g2.drawString(""+c.getConnectionID(), middleX+6, middleY);
			g2.drawString(""+c.getWeight(), middleX+2, middleY+17);
		}
		
		Iterator<Waypoint> wIter = wpController.getWpList().values().iterator();
		while(wIter.hasNext()){
			Waypoint wp = wIter.next();
			
			int xcoord = wp.getXPos();
			int ycoord = wp.getYPos();
			
			g2.setColor(waypointColor);
			g2.setStroke(new BasicStroke(4.0f));
			g2.fillOval(xcoord-25, ycoord-25, 50, 50);
			
			if(wp.getWaypointID()<10){
				g2.setFont(wpInnerFont);
				g2.setColor(wpInnerFontColor);
				g2.drawString(""+wp.getWaypointID(), xcoord-2, ycoord+5);
				g2.setFont(wpOuterFont);
				g2.setColor(wpOuterFontColor);
				g2.drawString(wp.getName(), xcoord-30, ycoord-25);
			} else {
				g2.setFont(wpInnerFont);
				g2.setColor(wpInnerFontColor);
				g2.drawString(""+wp.getWaypointID(), xcoord-6, ycoord+5);
				g2.setFont(wpOuterFont);
				g2.setColor(wpOuterFontColor);
				g2.drawString(wp.getName(), xcoord-30, ycoord-30);
			}
		}
		mouseEvent = false;
	}
	
	public void createWireFrame(int width, int height, int size, Graphics2D g2){
		//senkrechten linien zeichnen
		for(int w=0; w<width; w+=size){
			g2.drawLine(w, 0, w, height);
		}
		//horizontale Linien zeichnen
		for(int h=0; h<height; h+=size){
			g2.drawLine(0, h, width, h);
		}
	}
	
	public int calculateMiddlePointX(int startX, int endX){
		return (startX+endX)/2;
	}
	
	public int calculateMiddlePointY(int startY, int endY){
		return (startY+endY)/2;
	}
	
	/*
	 * SETTER
	 */
	public void setTileMap(TileMap map){
		this.tileMap = map;
	}
	
	public void setMapLoaded(boolean loaded){
		this.mapLoaded = loaded;
	}

}

also sobald ich waypoints hinzufüge oder bewege(dragge) dann rufe ich updateUserInterface() auf!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben