# Text in Canvas scrollen lassen



## MiMij (6. Nov 2007)

Hi,

also folgendes Problem:
Ich hab alles in Canvas geschrieben und benutze keine vorgefertigten Listen etc. Daher hab ich das Problem das ich darauf achten muss, das der text am Ende der Zeile gebrochen wird und nur so viel geschrieben wird wie der Bildschirm gross ist. 
Jetzt hab ich es wohl hinbekommen das mein Text scrollt bei nem normalen Text, da hab ich einfach jede Zeile in nen Vector gesteckt und lasse dann Zeile fuer Zeile das ausgeben, scroll ich dann runter, komtm die naechste Zeile. 
Das Problem ist nun bei einem Vote menu. Es sind checkboxen, und der Text hinter so einer Checkbox, kann natuerlich auch laenger sein als eine Zeile. Somit kann ich hier nicht die Idee mit dem Vector benutzen. Jedenfalls nicht so wie oben. Also hab ich eine neue Klasse angelegt, die ein chooseObject enthaelt. Dieses object hat dann von jeder Vote Option die Zeilen und die lasse ich dann zeichnen. Das funktioniert auch, jedoch nur solange die naechste Zeile wenn cih runter scrolle nicht mehrere Zeilen hat. 

Mal nen Beispiel:
Koennen jetzt 8 Zeilen auf den Bildschirm, und sind diese alle einzeilig ausser die erste die ist 2 zeilig. Die naechste Zeile waere 3 Zeilig, scroll ich nun runter, muesste er ja theroretisch die ersten 2 vote objecte "wegnehmen" das waeren dann die 3 zeilen die mir fehlen. Jedoch funktioniert das nicht.

Ausserdem ist das ein riesieges Chaos, und ich muss tausende von Abfragen machen, wie viel zeilen die erste, die zweite zeile uws hat und die letzte und und und...

Mir wurde gesagt das selbst J2ME Polish das nohc nicht ordentlich hinbekommen hat. Das deprimiert mich nun schon ein wenig.
kann ich nciht irgendwie das wie bei nem Bild machen, und einfach nur nen Bestimmten bereich davon zeichnen? Dann koennte ich einfach alle vote optionen zeichnen, und nur das was gerade aktuell ist, anzeigen lassen. So waere es auch moeglich das zb nur nen stueck von der naechsten zeile zu sehen ist.

Danke fuer die Hilfe.


----------



## The_S (6. Nov 2007)

Warum so umständlich? Erstell dir doch ein Bild mit der Displaybreite und errechne anhand deiner componenten die benötigte größe. Darauf zeichnest du dann alles. Dieses Bild stellst du anschließend auf deinem Canvas dar und wenn gescrollt werden soll, malst du das bild einfach ein bisschen weiter oben im minus-bereich.


----------



## MiMij (6. Nov 2007)

Sorry ich denk immer zu kompliziert, und da nen Mitarbeiter hier in der Firma auch schon sagte das is schwer, war ich noch demotivierter ^^

Also du meinst, ich mache ein leeres Image. Mit der Breite vom Display und der hoehe aller vote optionen. Diese zeiche ich alle auf das grafik object von dem leeren Bild und zeichne dann immer nur den Berecih von dem Bild den ich gerade benoetige?
Das problem ist ja noch, wenn ich die Pfeiltaste nach unten druecke muss ja die naechste vote optionen makiert werden also andere textfarbe oder so, dann muesste ich jedes mal das Bild neu erstellen?!


----------



## The_S (6. Nov 2007)

Naja, du kannst dir auch den Umweg über das Bild sparen und gleich direkt zeichnen. Müsstest dann die Zeichenpositionen immer weiter nach oben/unten verschieben.


----------



## MiMij (6. Nov 2007)

Wie meinst du das mit Zeichenposition immer nach oben/ unten verschieben?


----------



## The_S (6. Nov 2007)

Du gibst ja an, wo du z. B. deine Strings zeichnest. Das darste jetzt nicht mehr fest eincodieren, sondern musst variablen festlegen. Und wenn gescrollt werden soll, musst du die Variablen entsprechend anpassen. Geht vorallem um die Y-Koordinate.


----------



## MiMij (6. Nov 2007)

Ich hab ja schon ne variable Hoehe in meiner chooseLine klasse


```
public void drawLines (int currentTextPositionHeight, Graphics g) {
		if (chooseTyp.equalsIgnoreCase("checkBox")) {
			g.drawRect(5, currentTextPositionHeight+selected.getHeight()/4, 10, 10);
			if (isSelected()) {
				g.fillRect(5, currentTextPositionHeight+selected.getHeight()/4, 10, 10);
			}
		}
		for (int i = 0; i < lines.size(); i++) {
			g.drawString(lines.elementAt(i).toString(), 20, currentTextPositionHeight,
					Graphics.TOP | Graphics.LEFT);
			currentTextPositionHeight += selected.getHeight();
		}
	}
```

Das waere jetzt ein object einer vote zeile. ich sag halt der soll das object zeichnen und der zeichnet dann die linien. und die currentTextPositionHeight, wird dann in der anderen Klasse berechnet mit den anzahl der Zeilen.


----------



## The_S (6. Nov 2007)

ok, und was war jetzt gleich die Frage?


----------



## MiMij (6. Nov 2007)

Das funktioniert so net ^^
Ich hab in der Hauptklasse immer geschaut wie viel Zeilen ich zeichnen kann, und dann wie viele Zeilen die naechste Vote option hat, wenn es reinpaste hab cih es gezeichnet. 
Wenn jetzt zb die erste option 2 zeilen hat, und ich nen stuecken nach unten scroll muss ja noch der 2. teil der 1. option dort stehen, zb. Mir wurde ich sagt ich soll net Zeilenweise arbeiten und ich soll nen view machen und nen offset fuer jede vote option. Aber wie genau konnt der mir auch net sagen. Daher hoerte sich das mit dem image ganz gut an, aber das ist ja ziemlich uneffizient denk ich mal.


----------



## The_S (6. Nov 2007)

Naja, du dürfst ja auch net sagen 1 Elment = 1 Zeile, sondern musst gucken wie viele Zeichen du in eine Zeile bekommst. Wenn die Zeile voll ist, dann überprüfen ob es dann komplett in die zweite Zeile passt, wenn das auch net passt, dann ob es mit 3 Zeilen reicht, etc. Und anhand deren Werte musst du dann rechnen.


----------



## MiMij (6. Nov 2007)

Also das mit dem Zeilenumbruch ist kein Problem. Ich kann problemlos mein chooseLine object aufrufen und fragen wie viel zeilen das hat. Wenns auf den Bildschirm passt mit der Zeilenanzahl, dann sag ich das er das zeichnen soll. Dann schau ich zum naechsten chooseLIne object und frag wieder wie viele Zeilen, passt es net drauf, beende ich die for schleife. scroll ich nun runter sag ich einfach das startline und die endline eins hoeher ist, jedoch funktioneirt das net so, hat nun die naechste vote option mehr Zeilen als die jetztige erste muss ich ja die startline mit mehr als 1 erhoehen.


----------



## The_S (6. Nov 2007)

Dann hast du da wohl nen Fehler im Code  . Sry, hab grad net so die Muse mir dein Code anzugucken.


----------



## MiMij (6. Nov 2007)

Hm, vielleicht weiss ja noch wer anders was dazu?!


----------



## JimPanse (21. Nov 2007)

Hallo,

hab sowas ähnliches mal für eine Beschreibung für ein Spiel Programmiert. Ist aber schon lange her deshalb weiß ich nicht mehr genua die methoden

Eigentlich ganz Simple:


```
//Zeichne also von i bis index

for(int i = index; i < textListe.length && i < index; i++){

    arg0.drawString();
}

// key Event
public void keyPressed(keyEvent e){
switch(e){
down: index --;

up: index++;
}

repaint();
}
```

Das heißt wenn der Nutzer runter drückt wird immer i bis index + 1 (also neue Zeile angezeigt)!


----------

