PDA

Visualizza la versione completa : [JAVA] Aiuto con JTextPane...


acarri
15-12-2004, 20:05
Cari amici e colleghi,

ho disperatamente bisogno di vostri lumi. Sto sviluppando un'applicazione che elabora del testo, una sorta di Word. La parte destinata al testo scritto, diciamo il foglio per intenderci, è determinato da un oggetto di tipo JTextPane, che mi permette di scriverci dentro testo di varie font, grandezze e stili, ecc.

Il problema è: come posso settare le dimensioni del "foglio", quindi del JTextPane???

Ho provato con setSize(width, height), metodo ereditato da Component, ma nulla!!! Se non vado a capo con l'invio, il testo sta sempre su una stessa riga.


AIUTOOOOO!!!!!!!!!!

Grazie a tutti coloro che riusciranno ad illuminarmi!

unomichisiada
15-12-2004, 20:31
Io inquesto momen to non ti so aiutare direttamente però se avessi il tuo stesso problema andrei a controllare i sorgenti dell'applicazione demo distribuita con la jdk ...\j2sdk1.4.1_05\demo\jfc\Notepad

netarrow
15-12-2004, 20:53
ho guardato già io sul Notepad.jar, va anche lui a capo solo con l'invio.

Ora non ricordo se JTextPane ha il metodo setLineWrap(boolean), se non è presente potresti guardare i sorgenti della classe JTextArea, che sicuramente l'ho incapsula, e vedere come è implementato.

In alternativa potresti utilizzare il metodo setCaretPosition, se uno imposta margine 15, e per semplicità 15 è uguale a 15 caratteri, dopo il 15-esimo caratte lo riporti alla riga succesiva e indietro di 15.

:ciauz:

LeleFT
15-12-2004, 22:53
Io l'ho utilizzata nella mia chat, per visualizzare i messaggi, in questo modo: l'ho inserita in un JScrollPane. Dopodiché ho settato la dimensione del JScrollPane e, conseguentemente, anche la dimensione della JTextPane interna:


JTextPane jtp = new JTextPane();
jtp.setEditable(true); // nella mia chat è impostata a false...
JScrollPanel jsp = new JScrollPane(jtp);

jsp.setSize(width, height);
jtp.setSize(width, height);

In questo modo, quando il testo raggiunge il bordo destro, viene automaticamente portato a capo.


Ciao. :ciauz:

acarri
16-12-2004, 15:50
Innanzitutto grazie per l'interessamento e per i pareri esposti.

Tra i vostri suggerimenti ed un'occhiata al tutorial di Java, sono riuscito a risolvere parzialmente il problema. Ho definito il mio JTextPane all'interno di un JScrollPane di cui ho settato le dimensioni e poi ho posizionato quest'ultimo su un JPanel:

----------------------------------------------------
textPane = new JTextPane();

JScrollPane paneScrollPane = new JScrollPane(textPane);

paneScrollPane.setPreferredSize(new Dimension(200, 200));
paneScrollPane.setMinimumSize(new Dimension(10, 10));

JPanel rightPane = new JPanel(new GridLayout(1,0));
rightPane.add(paneScrollPane);
rightPane.setBorder(BorderFactory.createCompoundBo rder(BorderFactory.createTitledBorder(titolo),Bord erFactory.createEmptyBorder(5,5,5,5)));

add(rightPane);
----------------------------------------------------


Risultato: la pagina risulta limitata ORIZZONTALMENTE, cioè quando il testo arriva alla fine della pagina va a capo in automatico.

Quello che NON ho ottenuto è che si blocchi qaundo arriva in fondo alla pagina. Bensì coninua a scrivere allungando la pagina all'infinito.


Come posso fare?

HELP, PLEASE!!! Sto impazzendo! :dhò: :dhò: :dhò:

LeleFT
16-12-2004, 17:18
A questo punto non lo so... non vedo quali vantaggi tu possa avere dal non allungamento in verticale... prova a rimuovere il componente dal JScrollPane... per ora non vedo altre soluzioni.


Ciao. :ciauz:

acarri
17-12-2004, 09:15
Beh, per ciò che riguarda i vantaggi: il cliente per cui sto sviluppando il prodotto vuole un editor di testo capace di dividere il testo scritto in pagine. Quindi se non posso limitare lo spazio di scrittura (il JTextPane) in verticale, come posso delimitare la singola pagina?

Capito ora qual è il mio scopo quindi il mio problema?

Grazie ancora a tutti, spero che insieme riusciamo a realizzare ciò che cerco!

unomichisiada
17-12-2004, 19:57
private int printText(TextToPrint text, Book book, Vector currentPage, int currY, int xLimit, int yLimit) {
// set the font used to print this text
graphics.setFont(text.font);

// Get the FontMetrics for the current Font
fm = graphics.getFontMetrics();
int rowHeight = fm.getHeight();

// If a new page is beginning shift the cursor in the bottom position of the first row
if (currY == 0) currY = rowHeight;

// Tokenize the test to be printed in row
StringTokenizer st = new StringTokenizer(text.text, "\n", true);

// Remember is the last row printed is empty or not
boolean emptyRow = true;

while (st.hasMoreTokens()) {
String currentRow = st.nextToken();

// If the row is empty move down the point of a distance equal to the row height
if (currentRow.equals("\n")) {
if (emptyRow) {
currY += rowHeight;

// If the page is finished save it in the book and begin a new one
if (currY >= yLimit) {
book.append(new Page((Vector)currentPage.clone()), pf);
currentPage.removeAllElements();
currY = rowHeight;
}
} else emptyRow = true;
} else {
// the row isn't empty
emptyRow = false;

// split the current block of text in more row to fit it in the page
Enumeration rows = splitString(currentRow, xLimit).elements();

// Print the text a row at time
while (rows.hasMoreElements()) {
currentPage.add(new StringToPrint((String)rows.nextElement(), text.font, (int)pf.getImageableX(), (int)pf.getImageableY() + currY));
currY += rowHeight;

// If the page is finished save it in the book and begin a new one
if (currY >= yLimit) {
book.append(new Page((Vector)currentPage.clone()), pf);
currentPage.removeAllElements();
currY = rowHeight;
}
}
}
}
return currY;
}
Guarda questo codice,forse non fa perfettamente al caso tuo ma può darti qualche idea su come la cosa possa essere fatta.

Loading