Ostatnio próbuję na zaliczenie na studiach zrobić grę opartą na mapie na Hexcellsach.
Jak na razie mam zrobiony interfejs do edycji map oraz generowanie + edytowanie pól na mapie.

Mapa jest generowana jako Bitmapa a potem nanoszona na obiekt Canvas umieszczony w JScrollPane gdyż czasem nie mieści się ona na ekranie.
Kod wygląda tak:

(Panel Main to JScrollPanel)

	// ----------------------------------------------------------------------------------------------------
	public static void drawField() {
		mapFields.draw();		// kod generowania bitmapy
		drawInBackground();
		
	}
	// ----------------------------------------------------------------------------------------------------
	public static void drawInBackground() {
		Thread drawThread = new Thread( new Runnable() {
			public void run() { while (true) {
				
				panelMain.setSize( panelMain.getSize().width , panelMain.getSize().height );
				
				canvas.setSize(
						max( panelMain.getWidth(), mapFields.getDrawWidth() ),
						max( panelMain.getHeight(), mapFields.getDrawHeight() )
						);
				
				Graphics2D paintCanvas = (Graphics2D) canvas.getGraphics();
				paintCanvas.drawImage(mapFields.getBitmap(), 0, 0, ImageObserver);
		
			} }
		});
		drawThread.start();
	}
	// ====================================================================================================

Draw in background musi działać dlatego, że po samym wyrysowaniu bitmapy na Canvas, ona po prostu znika (czyli przekopiowanie kodu z Thread'a do procedury drawField i nie zapętlenie go), a kolejny powód dla którego jest to w wątku to używanie scrollbarów z JScrollPanel.

Zapytacie więc, jaki jest problem?
Problem wygląda niestety tak:

01.png
02.png

Podczas używanie ScrollBarów, przesuwa się cały Canvas po obszarze okna i nie aktualizuje się, dopiero po próbie zmiany rozmiaru okna, Canvas wraca do JScrollPanela i rysuje ten fragment który jest akurat widoczny.