Mehrere Canvas in einer ScrollPane

Jens B.

Erfahrenes Mitglied
Hallo!
Ich bin gerade dabei ein Schreibprogramm zu entwickeln. Schreiben nicht per Tastatur, sondern mit der Maus oder per Touchscreen / Tablet, also so etwas wie Xournal oder Jarnal. Da mir dort einige Funktionen fehlen mach ich es lieber selber :)

Leider habe ich mit den Malfunktionen von Java null Erfahrungen. BIsher habe ich eine Klasse, die Canvas extendet, und male dort hinein. Das funktioniert auch ganz gut; beim vergrößern und verkleinern des Fensters wird aber komischerweise immer der Inhalt des Canvases gelöscht, woran könnte das liegen?

Außerdem möchte ich nicht einfach einen Malbereich machen, sondern das Ganze auf Seiten aufteilen, wie es auch in Word o.Ä. ist. Ich dachte da an eine Liste von Canvases, jeder repäsentiert eine Seite, die irgendwie untereinander in einer JScrollPane angezeigt werden. Allerdings weiß ich nicht, wie ich die Canvases in der JScrollPane genau positionieren kann und ob das überhaupt eine gute Idee ist?

Sollte ich vielleicht lieber irgendeine andere Klasse als Canvas benutzen? Ich finde sie ist sehr umständlich zu benutzen udn ich kenne bisher auch keinen Weg um an die Daten darin ranzukommen.

Code ist recht lang, es geht hier ja auch eher ums Prinzip.

Danke für eure Hilfe!
 
Statt Canvas würde ich JPanel nehmen und davon erben.

beim vergrößern und verkleinern des Fensters wird aber komischerweise immer der Inhalt des Canvases gelöscht, woran könnte das liegen?
scheint so, als würdest du nicht in der paint() / paintComponent() -Methode zeichnen, sondern irgendwo anders.

Einführungen in das Zeichnen auf graphischen Komponenten gibts z.B. http://openbook.galileocomputing.de...20_001.htm#mj25cc7d47e476b8b1a183a10ee741dbaa und http://download.oracle.com/javase/tutorial/2d/index.html

Zu der Liste an Canvas-Objekten:
Um dein Schreibprogramm sinnvoll zu entwickeln, so dass du den Inhalt auch abspeichern kannst, würde ich eine andere Vorgehensweise wählen: Ein JPanel innerhalb eines anderen JPanels mit JScrollBars, also so:
Code:
                                                  |J
                                                  |S
                                                  |c
                                                  |r
                                                  |o
                                                  |l
                                                  |l
              JPanel                              |B
                                                  |a
                                                  |r
_________________________
JScrollBar
Und nur die aktuelle Seite(n) darstellen. Wenn du für jede Seite ein eigenes Canvas oder JPanel erzeugst, ist das nicht ansatzweise skalierbar: Du wirst viel Speicher verbrauchen und bei jeder Änderung z.B. auf der 1. von 300 Seiten würde dazu führen, dass jede Seite neu berechnet werden muss.

Tipp: schau dir den Quellcode von http://jedit.org/ und des Editors von Netbeans an. Vielleicht können die auch schon, was du willst.
 
Hallo nochmal,
danke für deine Hilfe! Werde jetzt wohl die Ansicht auf 2 Seiten gleichzeitig beschränken, das macht denke ich Sinn. Habe jetzt über JPanels gezeichnet, allerdings wird immernoch der Inhalt beim vergrößern des Fensters gelöscht.

Bin schon auf die Idee gekommen alle Zeichenschritte manuell zu speichern und diese dann bei jedem Fenstervergrößern komplett nachzuzeichnen, aber das ist ja Quatsch, was? Hier ein Teil meines bisherigen Codes:

Java:
	class TestCanvas extends JPanel {		
		TestCanvas() {
		}
				
		@Override 
		public void paintComponent(Graphics g) {
			Graphics2D g2 = (Graphics2D) g;
			g2.setStroke(new BasicStroke(thickness, CAP_ROUND, JOIN_BEVEL));
			g2.setColor(getCol(color));
			   
			g2.drawLine(last_x, last_y, xvalue, yvalue);
		}
	}

....

// "master" ist eine Instanz obiger Klasse
	      	master.addMouseMotionListener(new MouseMotionAdapter() {
	            public void mouseDragged( MouseEvent event ) {
	            	last_x = (last_x == -10 ? event.getX() : xvalue);
	            	last_y = (last_y == -10 ? event.getY() : yvalue);
	            	xvalue = event.getX();
	            	yvalue = event.getY();
	            	master.repaint();
	            }
});

Das ist natürlich nur ein Codeausschnitt, alle Variablen werden wo anders gültig eingeführt. Darum geht es ja auch nicht :) thickness und color werden über die Werkzeugwahl gesetzt.

Danke.
 
Zurück