Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto
Nothing con il suo nuovo Phone 4(a) conferma la sua identità visiva puntando su una costruzione che nobilita il policarbonato. La trasparenza resta l'elemento cardine, arricchita da una simmetria interna curata nei minimi dettagli. Il sistema Glyph si evolve, riducendosi nelle dimensioni ma aumentando l'utilità quotidiana grazie a nuove funzioni software integrate e notifiche visive. Ecco tutti i dettagli nella recensione completa
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-04-2009, 18:35   #1
drinkredbull
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.
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 18:41   #2
TeknoMan
Senior Member
 
L'Avatar di TeknoMan
 
Iscritto dal: Sep 2002
Città: La-La Land
Messaggi: 636
fai un controllo sulla lunghezza della stringa...
__________________
Ciao
TeknoMan è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2009, 18:52   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 09:53   #4
drinkredbull
Junior Member
 
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
Quote:
Originariamente inviato da TeknoMan Guarda i messaggi
fai un controllo sulla lunghezza della stringa...
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:
Originariamente inviato da PGI-Bis Guarda i messaggi
Usa java.awt.font.LineBreakMeasurer.

Nella documentazione c'è un esempio d'uso.

Puoi usare AttributedString come AttributedCharacterIterator.
Allora, sono andato a guardare ma la comprensione mi è risultata un po difficoltosa. Comunque in pratica, dovrei usare il LineBreakMeasurer() al posto del drawString(), ed all'interno dovrei inserire come parametro l' AttributedString(miastringa). Il problema è che dovrei inserire anche gli altri due parametri: BreakIterator breakIter e FontRenderContext frc , dei quali non ne ho ben capito l'utilita e come usarli...

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!
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 14:28   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Incollo un esempio commentato.

Codice PHP:
import java.awt.font.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import javax.swing.*;

public class 
Main extends JPanel implements Runnable {
    public static 
void main(String[] args) { EventQueue.invokeLater(new Main()); }
    public 
void run() { createAndShowFrame(); }
    
    private 
String text;
    
    private 
void createAndShowFrame() {
        final 
JTextField field = new JTextField();
        
field.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent e) {
                
text field.getText();
                
repaint();
            }
        });
        
JFrame window = new JFrame();
        
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
window.add(this);
        
window.add(fieldBorderLayout.SOUTH);
        
window.setSize(640480);
        
window.setVisible(true);
    }
    
    protected 
void paintComponent(Graphics g) {
        
super.paintComponent(g);
        
Insets insets getInsets();
        
int maxWidth getWidth() - insets.left insets.right;
        
int maxHeight getHeight() - insets.top insets.bottom;
        if(
text != null) {
            
int stringX 20
            
int stringY 20;//(stringX, stringY) è il punto in cui si vuole disegnare la stringa
            
int maxX maxWidth//maxX è l'ordinata massima della stringa
            
int maxY maxHeight//maxY è la coordinata massima della stringa
            
drawString(text, (Graphics2D)g, new Rectangle(stringXstringYmaxXmaxY));
        }
    }
    
    private 
void drawString(String sGraphics2D gRectangle area) {
        
g.setPaint(Color.BLACK);//colore della stringa (se l'AttributedCharacterIterator non definisce colori autonomi)
        
AttributedCharacterIterator iterator = new AttributedString(s).getIterator(); //data la stringa s ottiene un iteratore su testo formattato
        
LineBreakMeasurer measurer = new LineBreakMeasurer(iteratorg.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(garea.xarea.y); //disegna il testo estratto in posizione area.x, area.y
            
area.+= painter.getAscent() + painter.getDescent(); //aggiorna la coordinata per disegnare la linea successiva sotto alla precedente
            
if(area.area.height) { //se è stato consumato tutto lo spazio verticale disponibile
                
break; //non c'è più spazio per disegnare altre linee
            
}
        }
    }

A te interessa solo il metodo "drawString". La posizione della stringa è la coppia (area.x, area.y). Il resto fa sì che se la stringa sia spezzata in più linee se la sua lunghezza ecceda la larghezza del componente (meno area.x per tenere allineati i paragrafi).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 16:11   #6
drinkredbull
Junior Member
 
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Incollo un esempio commentato.

... ... ...

A te interessa solo il metodo "drawString". La posizione della stringa è la coppia (area.x, area.y). Il resto fa sì che se la stringa sia spezzata in più linee se la sua lunghezza ecceda la larghezza del componente (meno area.x per tenere allineati i paragrafi).
Ti ringrazio molto, e riconosco che il codice è fatto bene. Infatti ho provato a copiarlo e poi esegurlo e funziona molto bene, mentre il metodo drawString sembra fatto proprio al caso mio.
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
      }
    }
  }
Allora, ti ho messo il metodo paint(), seguito dal tuo drawString.
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!
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 16:22   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 16:42   #8
drinkredbull
Junior Member
 
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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.
Ho trovato! Avevi ragione te' erano a 0. Mio errore. Ho sistemato, ed in effetti stampa andando a capo.
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!
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 16:49   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 17:05   #10
drinkredbull
Junior Member
 
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
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 .
Ti ringrazio molto per avermi seguito e consigliato. Probabilmente questa era una buona buona idea, ma sono riuscito a risolvere comunque inserendo l'incremento dell'y dentro il metodo drawString e verificando se sommare o sottrarre con in semplice if.

Finalmente son roiscito a far funzionare il programma e se ci sono riuscito, e sicuramente molto anche merito tuo! Grazie!
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2009, 17:19   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da drinkredbull Guarda i messaggi
Ti ringrazio molto per avermi seguito e consigliato. Probabilmente questa era una buona buona idea, ma sono riuscito a risolvere comunque inserendo l'incremento dell'y dentro il metodo drawString e verificando se sommare o sottrarre con in semplice if.

Finalmente son roiscito a far funzionare il programma e se ci sono riuscito, e sicuramente molto anche merito tuo! Grazie!
Per scrupolo potresti provare anche con il sistema suggerito da PGI-bis: perchè se è corretto ti consente di eliminare un if dal codice del metodo drawString, e non sarebbe male
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-04-2009, 09:20   #12
drinkredbull
Junior Member
 
Iscritto dal: Mar 2009
Città: Dolo(VE)
Messaggi: 8
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Per scrupolo potresti provare anche con il sistema suggerito da PGI-bis: perchè se è corretto ti consente di eliminare un if dal codice del metodo drawString, e non sarebbe male
Proverò a vedere quale dei 2 funziona meglio.
drinkredbull è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Gli utenti Intel possono dire addio all'...
NVIDIA: raggiungeremo almeno 1 triliardo...
Lenovo presenta workstation e server con...
Nuova BMW i3: la Serie 3 elettrica debut...
NVIDIA torna in Cina: stretto un accordo...
Vibe coding nel mirino di Apple: ecco le...
Smart TV QLED 50'' a un super prezzo: 4K...
Horizon Worlds lascia i visori Quest: Me...
Lexar compie 30 anni e cambia le regole ...
Questo SSD fornisce memoria aggiuntiva a...
PlayStation Portal si aggiorna: arriva l...
Akamai, le API nel mirino dei cyber atta...
Spider-Man: Brand New Day, finalmente on...
La serie TV di Hitman è ufficialmente fe...
"Grazie e arrivederci": Sam Al...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v