Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
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


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...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Dell rinnova la sua gamma di workstation...
NVIDIA DLSS 5 arriverà in autunno...
Intel Xeon 6 con P-core è la CPU ...
Telepass e TIM: la mobilità integ...
Deep Tech Revolution: le cinque startup ...
Leapmotor, sostenuta da Stellantis, ragg...
Isar Aerospace e Astroscale stringono un...
Donut Lab, test di ricarica con Verge TS...
Polestar, arriva un nuovo finanziamento ...
Friggitrice ad aria, tutto quello che de...
BYD lancia la nuova campagna per il bran...
Samsung Galaxy Book4 in offerta: portati...
HONOR MagicPad 4: più sottile, pi...
JBL Tune Flex 2 in forte sconto su Amazo...
Galaxy S26 Ultra Enterprise Edition crol...
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:10.


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