Guarda questo codice,forse non fa perfettamente al caso tuo ma può darti qualche idea su come la cosa possa essere fatta.codice: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; }