# Applet verwischt, wenn Seite gescrollt wird



## floman (15. Mai 2011)

Ich hab natürlich schon gesehen dass dieses Thema schon vorhanden ist, jedoch hab ich mit der Antwort nicht viel anfangen können.

Mein Applet besteht aus einer Swing komponente die eine Map darstellt und diversen normalen Swing Komponenten. Wie bzw. wo kann ich dem Applet sagen das es sich neu zeichnet wenn gescollt wird?


----------



## L-ectron-X (15. Mai 2011)

Welcher Browser, welches Betriebssystem, welche Java-Version?
Grafikkartentreiber auf dem neusten Stand? Wie siehts mit der Systemlast aus?


----------



## floman (15. Mai 2011)

Sowohl Firefox 4 als auch Internetexplorer, Windows 7, ja neueste Treiber sind installiert, die Systemlast ist ca gleich hoch wie wenn ich das Applet direkt in der IDE starte, vielleicht etwas höher. Java Version ist 1.6.0_23

Hab da noch eine Frage. Woran könnte es liegen wenn eine Swing Komponente erst dann angezeigt wird wenn ich darauf klicke? Testweise hab ich AWT verwendet und da hab ich das Problem nicht.


----------



## Marco13 (15. Mai 2011)

Sicher, dass du nicht AWT und Swing vermischst (z.B. ein Panel mit einem JButton drauf, oder ein JPanel mit einem Button drauf) ? Ein bißchen Code könnte helfen (muss aber nicht...)


----------



## floman (15. Mai 2011)

Ziemlich sicher. Ich adde alle Swing Komponenten direkt dem JApplet. Alles ohne Layout. Panel bzw JPanel gibts bei mir nicht.


----------



## L-ectron-X (16. Mai 2011)

Das sollte eigentlich kein Problem sein, obwohl man es eigentlich nicht so macht.
Setze mal alles, was du dem JApplet hinzufügst in ein JPanel und füge dieses ins JApplet ein.


----------



## floman (16. Mai 2011)

Das ändert leider nichts. Wenn wenigstens die Komponenten nicht teilweise erst nachdem ich die Maus drüber bewege oder darauf klicke erscheinen würden.


----------



## Marco13 (16. Mai 2011)

@L-ectron-X: Weißt du spontan auswendig inwieweit das bei JApplets mit ihren init- stat- und sonstigen Methoden im Zusammenhang mit dem EDT ein Problem sein kann? (Ich weiß grad nicht auf welchem Thread die alle aufgerufen werden...)


----------



## L-ectron-X (16. Mai 2011)

Sorry, nein, das weiß ich nicht, ohne mich schlau zu machen.
Das Ganze kommt mir "spanisch" vor.


----------



## Marco13 (16. Mai 2011)

@floman: Ist es möglich den Code zu posten oder das Applet hochzuladen?


----------



## floman (16. Mai 2011)

Ja sicher, i hoffe es reicht die init(), die beinhaltet ja die GUI. Das Applet besteht schon aus mehreren Klassen und ist schon ein bischen unübersichtlich. 


```
public void init() {

		// tells the openmap to be an applet
		Environment.init(this);

		// applet size, matches 640x480 by factor 1.1
		setSize(704, 528);

		// createTestCursor();
		// setCursor(c);
		Cursor normal = new Cursor(Cursor.DEFAULT_CURSOR);
		setCursor(normal);
		// setLayout(null);

		// notwendig
		// addMouseMotionListener(this);
		// addMouseListener(this);

		start_button = new JButton("Start/Continue");
		start_button.addActionListener(this);

		jSlider = new JSlider(0, 10, 0);
		jSlider.setMinorTickSpacing(1);
		jSlider.setMajorTickSpacing(10);
		jSlider.setName("Level");
		jSlider.setPaintTicks(true);
		jSlider.setSnapToTicks(true);
		jSlider.setPaintTrack(true);
		jSlider.setPaintLabels(true);

		info = new JLabel();
		nickname = new JLabel();

		checkboxGroupMaps = new ButtonGroup();
		checkboxEu = new JRadioButton("Europe");
		checkboxEu.setSelected(true);
		checkboxWorld = new JRadioButton("World");

		checkboxGroupMaps.add(checkboxEu);
		checkboxGroupMaps.add(checkboxWorld);

		DatabaseHandler.getInstance().createDBConnection();

		DatabaseHandler.getInstance().calcNumberOfLocationsWorld();
		DatabaseHandler.getInstance().calcNumberOfLocationsEurope();
		// System.out.print(DatabaseHandler.getInstance().numberOfLocationsEurope+"\n");
		// because the map shows basically the world
		DatabaseHandler.getInstance().loadCidsOfEurope();

		gameLogic = new GameLogic();
		// appletUpdater = new AppletUpdater(this);

		gameLogic.setSounds(null, null, null);
		gameLogic.setGameEntry(this);
		gameLogic.setLevel(0);
		gameLogic.setMap(true);
		gameLogic.setMapHeight(mapHeight);
		gameLogic.setMapWidth(mapWidth);

		gameLogic.setScale(worldScale);// default
		gameLogic.setCenter(worldCenter);// default

		// Cursor cursor = new Cursor(Cursor.DEFAULT_CURSOR);
		// setCursor(cursor);
		// setSize(640, 480);

		// setLayout(new FlowLayout());

		/*
		 * The BasicMapPanel automatically creates many default components,
		 * including the MapBean and the MapHandler.
		 */
		MapPanel mapPanel = new BasicMapPanel();
		MapHandler mapHandler = mapPanel.getMapHandler();
		mapBean = mapPanel.getMapBean();

		// LatLonPoint p2; //= new LatLonPoint(getDecFromLatOrLong(48, (float)
		// 12,
		// //(float) 0), getDecFromLatOrLong(16, (float) 22, (float) 0));
		// //System.out.print("DIS " + llp.distance(p2) + "\n");
		// //london
		// p2 = new LatLonPoint(51.48791122f, -0.177998126f);
		//
		// //graz
		// LatLonPoint p1 = new LatLonPoint(47.06492233f,15.43110085f);
		// float dist = Length.KM.fromRadians(p1.distance(p2));
		// System.out.print("dist="+dist+"\n");

		mapBean.setSize(mapWidth, mapHeight);

		// Set the map's default center
		mapBean.setCenter(worldCenter);
		// Set the map's default scale
		mapBean.setScale(worldScale);

		// mapBean.setScale(worldScale);

		// default
		// gameLogic.setScale(europeScale);
		// gameLogic.setScale(worldScale);

		// funktioniert nicht richtig
		// oder in mousemove() setScale()??
		mapBean.addMouseWheelListener(new MouseWheelListener() {

			@Override
			public void mouseWheelMoved(MouseWheelEvent e) {
				System.out.println("do nothing");
				// mapBean.setScale(5000000f);
				// mapBean.
				// mapBean.repaint();
			}
		});

		System.out.print("listensteners"
				+ mapBean.getMouseWheelListeners().length + "\n");

		MouseDelegator mouseDelegator = new MouseDelegator();
		mapHandler.add(mouseDelegator);

		SelectMouseMode selectMouseMode = new SelectMouseMode();

		// map cursor
		cursor = new Cursor(Cursor.CROSSHAIR_CURSOR);
		selectMouseMode.setModeCursor(cursor);
		mapHandler.add(selectMouseMode);

		mouseDelegator.setActive(selectMouseMode);

		/*
		 * Create and add a LayerHandler to the MapHandler. The LayerHandler
		 * manages Layers, whether they are part of the map or not.
		 * layer.setVisible(true) will add it to the map. The LayerHandler has
		 * methods to do this, too. The LayerHandler will find the MapBean in
		 * the MapHandler.
		 */
		// mapHandler.add(new LayerHandler());
		//
		// // Add a route layer.
		// RouteLayer routeLayer = new RouteLayer();
		// routeLayer.setVisible(true);
		// // The LayerHandler will find the Layer in the MapHandler.
		final MyMapMouseListener myMapMouseListener = new MyMapMouseListener();

		ShapeLayer shapeLayer = new ShapeLayer() {
			//
			// When asked for the mouse listener, return my version.
			//
			public synchronized MapMouseListener getMapMouseListener() {
				return myMapMouseListener;
			}
		};

		Properties shapeLayerProps = new Properties();
		shapeLayerProps.put("prettyName", "Political Solid");
		shapeLayerProps.put("lineColor", "000000");
		shapeLayerProps.put("fillColor", "BDDE83");
		shapeLayerProps.put("shapeFile", "maps/cntry02.shp");
		// shapeLayerProps.put("shapeFile", "maps/dcwpo-browse.shp");
		// shapeLayerProps.put("spatialIndex", "maps/dcwpo-browse.ssx");
		shapeLayerProps.put("spatialIndex", "maps/cntry02.ssx");

		shapeLayer.setProperties(shapeLayerProps);
		shapeLayer.setVisible(true);

		mapBean.add(shapeLayer);

		JPanel jPanel = new JPanel();
		jPanel.setLayout(null);

		// JButton button = new JButton("muh");
		// button.addActionListener(this);
		//
		// JButton button1 = new JButton("muh1");
		// button1.addActionListener(this);

		// Container container;
		// container = getContentPane();
		// container.setLayout(null);

		// c.setLayout(new FlowLayout());
		// c.add(jPanel);
		// System.out.print(jPanel.size() + "\n");
		// // c.add(mapBean);
		// c.add(jPanel2);
		// mapHandler.add(frame);
		// // Last on top.
		// mapHandler.add(shapeLayer);
		// mapHandler.add(new GraticuleLayer());
		// mapHandler.add(routeLayer);
		// mapBean.setBounds(0, 150, 640, 480);
		// c.add(mapBean);
		// add(mapBean);
		// JPanel jPanel = new JPanel();
		// //jPanel.setLayout(new FlowLayout());
		// jPanel.setBounds(0,480 , 800,600);
		// // JPanel jPanel2 = new JPanel();
		// // jPanel2.setLayout(new FlowLayout());
		// jPanel.setLayout(new FlowLayout());
		// jPanel.add(mapBean);
		// jPanel2.add(button1);
		// button.setBounds(0, 0, 50, 50);
		mapBean.setBounds(0, 0, 640, 480);
		// container.add(button);

		// container.add(mapBean);

		checkboxEu.setBounds(0, mapBean.getHeight(), 100,
				(this.getHeight() - mapBean.getHeight()) / 2);
		checkboxWorld.setBounds(0,
				mapBean.getHeight() + checkboxEu.getHeight(), 100,
				(this.getHeight() - mapBean.getHeight()) / 2);

		jSlider.setBounds(checkboxEu.getWidth(), mapBean.getHeight(), 200,
				this.getHeight() - mapBean.getHeight());

		info.setBounds(jSlider.getWidth() + checkboxEu.getWidth(),
				mapBean.getHeight(), 100,
				(this.getHeight() - mapBean.getHeight()) / 2);
		info.setText("INFO:");
		// label.setAlignmentX(JLabel.CENTER);

//		nickname.setBounds(jSlider.getWidth() + checkboxEu.getWidth(),
//				mapBean.getHeight() + info.getHeight(), 100,
//				(this.getHeight() - mapBean.getHeight()) / 2);
//		nickname.setText("Name:");
//		// nickname.setAlignmentX(JLabel.CENTER);
//		location = new JLabel();
//
//		location.setBounds(
//				jSlider.getWidth() + checkboxEu.getWidth() + info.getWidth(),
//				mapBean.getHeight(), 200,
//				this.getHeight() - mapBean.getHeight());
//		location.setText("hallo");

		// label.setBounds(checkboxEu.getWidth(), mapBean.getHeight(), 300, 50);
		// jPanel.add(label);
		// jPanel.add(start_button);
		// jPanel.add(checkboxEu);
		// jPanel.add(checkboxWorld);
		// jPanel.setCursor(nc);
		// jPanel.setVisible(true);
		

		jPanel.add(mapBean);

		jPanel.add(checkboxEu);
		jPanel.add(checkboxWorld);
		jPanel.add(jSlider);// jSlider.setVisible(true);
		jPanel.add(info);
//		jPanel.add(nickname);
//		jPanel.add(location);
//		jPanel.add(start_button);
		// setVisible(true);
		// container.add(jLabel);
		// this.pack();
		System.out.print("Init done\n");

		// appletThread = new Thread(this);
		// appletThread.start();
		// jPanel.setVisible(true);

		add(jPanel);

	}
```

Mir ist klar dass es noch nichts gleich schaut, es ist ja noch in der Testphase


----------



## Marco13 (17. Mai 2011)

Nun, daran erkennt man halt nicht viel. Statt 50 auskommentierter Zeilen wäre es eher hilfreich, die Zeilen zu haben, die es braucht, damit man das komplieren und starten (und damit den Fehler nachvollziehen) kann. Hast du irgendwo paint überschrieben oder so...?


----------



## floman (17. Mai 2011)

Naja ich hab mir halt gedacht du willst sehen wie ich die GUI zusammenstelle und das mach ich halt nur in der init(). Ja hab die paint() überladen. Ich zeichne damit nur zwei Punkte in einer Map. In der start() starte ich einen Thread in der destroy() schließe ich die Verbindung zur Datenbank und setzte diverse Objekte auf null. 

Ich werd mal versuchen nur die GUI zu starten.


----------



## Marco13 (18. Mai 2011)

Hast du in der paint wenigstens die erste Zeile als super-Aufruf überschrieben?

```
@Override
public void paint(Graphics g)
{
    [b]super.paint(g);[/b]
     ...
}
```
(wobei... wenn nicht, dürfte er AFAIK GAR nichts anzeigen...)


----------



## floman (18. Mai 2011)

Danke, das wars. Doch angezeigt hats was, nur eben teilweise oder nicht sofort. Hätte mir nicht gedacht dass das mit der paint() zu tun hat. Kannst du mit bitte noch erklären warum ich das unbedingt machen muss bzw. wann ich das tun muss? Aja das Verwischen ist auch weg .


----------



## Marco13 (19. Mai 2011)

Das "paint" von Applet paintet den Inhalt des Applets - also eben auch die Components, die in dem Applet liegen (und ggf. den Hintergrund und so). Wenn man das überschreibt, passiert dort erstmal "nichts". Bei "super.paint(g)" sagt man quasi: "Male hier alles, was du sowieso malen mußt (also alle Components und so)" -  und dahinter kommen dann noch eigene Zeichenbefehle, die ggf. über das schon gemalte drübermalen.

Noch eine allgemeine Empfehlung: Es ist meistens besser (sauberer, nachvollziehbarer) wenn man in das JApplet NUR ein JPanel reinlegt (und NICHT paint überschreibt). Dieses JPanel ist dann meistens die "Haupt-Komponente" vom eigenen Programm. In dieses JPanel kann man dann buttons usw. reinlegen. Und wichtig: Wenn man eigene Dinge (mit Graphics) zeichnen will, sollte das meistens in einer eigenen, von JPanel abgeleiteten Klasse passieren. (Dort überschreibt man dann paintComponent). Dieses "ZeichenPanel" würde man dann ins "HauptPanel" legen. Das ganze also ein bißchen strukturieren und aufteilen, nicht alles pauschal ins Applet klatschen....


----------



## javaDev2011 (23. Mai 2011)

Hi,

@Marco13: Vielen, vielen dank auch von mir, endlich wird mein applet (eine Wanduhr) ohne verwischen angezeigt.
Hab wohl irgendwie nie versucht die super-Methode aufzurufen.

javaDev2011


----------

