|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
[JAVA]Richiesta:Stringa automaticamente a capo
Ciao ragazzi,
sto da poco tempo affrontando lo sviluppo dei primi applet java, ma ora mi trovo davanti ad un problema. Avrei la necessità di sapere se con il metodo draw.String() è possibile andare automaticamente a capo quando la stringa arriva alla fine della dimensione dell'applet, oppure se c'è un altro modo e/o un'altro metodo per mandare la stringa automaticamente a capo non ci stia tutta all'interno dell'applet... Vi ringrazio già a priori per l'aiuto. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2002
Città: La-La Land
Messaggi: 636
|
fai un controllo sulla lunghezza della stringa...
__________________
Ciao |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Usa java.awt.font.LineBreakMeasurer.
Nella documentazione c'è un esempio d'uso. Puoi usare AttributedString come AttributedCharacterIterator.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 | |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
Mi scuso per la mia non completa competenza, ma com'è che posso farlo? Lavoro su un oggetto di tipo String, non su un vettore di char...
Quote:
http://java.sun.com/j2se/1.4.2/docs/...RenderContext) In'oltre vorrei sapere anche come posso indicare le posizioni esatte in cui stampare la stringa sotto forma di coordinate, come già facevo col drawString, in quanto il mio programma si basa proprio su questo... Vi ringrazio per il prezioso aiuto che mi state offrendo! |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Incollo un esempio commentato.
Codice PHP:
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#6 | |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
Quote:
Solo che ho provato ad applicare il tutto al mio codice, ma questi appunto non funziona, stampandomi lo sfondo dell'applet, ma non la stringa. Ti posto la parte del mio codice dove stampo, così magari puoi darmi qualche consiglio: Codice:
int y; //variabile per posizionare il testo nel modo corretto sull'asse y... ... ...poi verrà modificata via via all'interno del programma...
int x=10;
int maxX = getWidth();
int maxY = getHeight();
... ... ...
public void paint(Graphics g)
{
super.paint(g);
setBackground(colore); //imposta colore sfondo scelto nei parametri
g.setColor(color); //imposta colore testo scelto nei parametri
g.setFont(textFont); //imposta font testo scelto nei parametri
setSize(w,h); //imposta le dimensioni dell'applet
try
{
if (velocita>0) //se la velocita' è >0...
{
for (i=100;i>0;i--) //...stampa dal basso verso l'alto
{
k=i-1;
if(loadArray("prova.txt",k)!=null)
{
drawString(loadArray("prova.txt",k),(Graphics2D)g, new Rectangle(x, y, maxX, maxY));
}
}
}
else //altrimenti,
{
for (i=0;i<100;i++) //stampa dall'alto verso il basso oppure lascia fermo il testo a seconda della scelta della velocita'
{
if(loadArray("prova.txt",i)!=null)
{
drawString(loadArray("prova.txt",i),(Graphics2D)g, new Rectangle(x, y, maxX, maxY));
}
}
}
}
catch(IOException e){g.drawString("Errore" ,200,100);}
}
... ... ...
private void drawString(String s, Graphics2D g, Rectangle area) {
g.setPaint(color);
AttributedCharacterIterator iterator = new AttributedString(s).getIterator(); //data la stringa s ottiene un iteratore su testo formattato
LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, g.getFontRenderContext());
while(measurer.getPosition() < iterator.getEndIndex()) { //measurer.getPosition() tiene traccia del testo finora "estratto" dal measurer
TextLayout painter = measurer.nextLayout(area.width - area.x); //estrae dal measurer un proiettore del testo nella linea corrente
painter.draw(g, area.x, area.y); //disegna il testo estratto in posizione area.x, area.y
area.y += painter.getAscent() + painter.getDescent(); //aggiorna la coordinata per disegnare la linea successiva sotto alla precedente
if(area.y > area.height) { //se è stato consumato tutto lo spazio verticale disponibile
break; //non c'è più spazio per disegnare altre linee
}
}
}
La variabile velocita' è una variabile che serve a me per vedere in pratica se stampare dall'inizio dal basso all'alto in o all'incontrario. loadArray() invece è un metodo che restituisce una stringa dopo averla letta da un file, lo so che è un po' obsoleto fare la lettura all'interno del paint, ma l'ho messo lì solo momentaneamente e cambierà quando sistemerò il codice. Comunque è accertato che il metodo funziona. Credo che ci sia qualche incongruenza nel passaggio di parametri o altro...Non riesco a trovare l'errore... Grazie mille! |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
A naso direi che i tuoi maxX e maxY sono zero. Per verificarlo possiamo usare il metodo della nonna.
Nel metodo drawString metti come prima istruzione un System.out.println(area); e vedi se le coordinate del rettangolo hanno qualcosa di strano.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#8 | |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
Quote:
Solo che nel mio programma ripeto la stampa più volte con varie stringhe diverse, è il metodo loadarray() che le prende. Ovviamente dopo aver stampato una stringa vado a capo usando il modo un po' "furbo" di incrementare la y di un numero di pixel necessari. Solo che adesso la parte della stringa che mi va' a capo si sovrappone alle stringhe sucessive... Come posso risolvere il problema? Grazie tante per il supporto! |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Potresti sfruttare un side-effect di drawString.
Il metodo incrementa il valore di area.y per ogni linea che disegna. Capita così che alla fine del metodo il valore di area.y sia anche quello della prima "linea" libera sotto al testo disegnato. Cioè se dico: Rectangle area = qualcosa; drawString(testo, g, area); ...qui area.y è la posizione y della prima linea libera sotto a testo. In teoria "riciclando" area dovremmo ottenere il disegno non sovrapposto di stringhe diverse: Rectangle area = qualcosa; drawString(testo, g, area); drawString(altroTesto, g, area); drawString(eccetera, g, area); Forse
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
Quote:
Finalmente son roiscito a far funzionare il programma e se ci sono riuscito, e sicuramente molto anche merito tuo! Grazie! |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:10.




















