utilizar uso que mostrar informacion como codigo java text limit lines jtextarea

uso - textarea multiline java



¿Cómo limitar las filas y columnas máximas de JTextArea? (2)

Lo siguiente funcionó para mí:

public class LimitedLinesDocument extends DefaultStyledDocument { private static final String EOL = "/n"; private int maxLines; public LimitedLinesDocument(int maxLines) { this.maxLines = maxLines; } public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException { if (!EOL.equals(str) || StringUtils.occurs(getText(0, getLength()), EOL) < maxLines - 1) { super.insertString(offs, str, attribute); } } }

Donde el método StringUtils.occurs es el siguiente:

public static int occurs(String str, String subStr) { int occurrences = 0; int fromIndex = 0; while (fromIndex > -1) { fromIndex = str.indexOf(subStr, occurrences == 0 ? fromIndex : fromIndex + subStr.length()); if (fromIndex > -1) { occurrences++; } } return occurrences; }

Estoy usando JTextArea en JScrollPane

Quiero limitar el número máximo de líneas posibles y los caracteres máximos en cada línea.

Necesito que la cadena sea exactamente como en la pantalla, cada línea terminará con ''/ n'' (si hay otra línea después de ella) y el usuario podrá insertar solo líneas X y caracteres Y en cada línea.

Traté de limitar las líneas, pero no sé exactamente cuántas líneas tengo debido al ajuste de línea. El ajuste de líneas está comenzando una nueva línea visualmente en la pantalla (debido al ancho de JTextArea) pero en la cadena de el componente es realmente la misma línea sin ''/ n'' para indicar una nueva línea. No tengo ni idea de cómo limitar los caracteres máximos en cada línea mientras escribo.

Hay 2 etapas:

  1. El tipeo de la cadena: mantenga que el usuario no podrá escribir más líneas X y caracteres Y en cada línea. (incluso si el ajuste de línea solo es visual o el usuario ha escrito ''/ n'')
  2. Inserte la cadena en el DB- después de presionar ''OK'', convierta la cadena de caracteres en que cada línea terminará con "/ n", incluso si el usuario no la escribió y la línea quedó envuelta únicamente en modo visual.

Hay pocos problemas si cuento los caracteres en la línea e inserto ''/ n'' al final de la línea, por eso decidí hacerlo en dos etapas. En la primera etapa, mientras el usuario está tipeando, prefiero limitarlo solo a la vista y forzar el corte de línea o algo similar. ¡Solo en la segunda etapa, cuando guardo la cadena, agregaré la ''/ n'' incluso si el usuario no la escribió al final de las líneas!

¿Alguien tiene alguna idea?

Sé que tendré que usar DocumentFilter OR StyledDocument.

Aquí hay un código de muestra que limita solo las líneas a 3: (pero no los caracteres en la fila a 19)

private JTextArea textArea ; textArea = new JTextArea(3,19); textArea .setLineWrap(true); textArea .setDocument(new LimitedStyledDocument(3)); JScrollPane scrollPane = new JScrollPane(textArea public class LimitedStyledDocument extends DefaultStyledDocument /** Field maxCharacters */ int maxLines; public LimitedStyledDocument(int maxLines) { maxCharacters = maxLines; } public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException { Element root = this.getDefaultRootElement(); int lineCount = getLineCount(str); if (lineCount + root.getElementCount() <= maxLines){ super.insertString(offs, str, attribute); } else { Toolkit.getDefaultToolkit().beep(); } } /** * get Line Count * * @param str * @return the count of ''/n'' in the String */ private int getLineCount(String str){ String tempStr = new String(str); int index; int lineCount = 0; while (tempStr.length() > 0){ index = tempStr.indexOf("/n"); if(index != -1){ lineCount++; tempStr = tempStr.substring(index+1); } else{ break; } } return lineCount; } }


Aquí está mi versión, basada en la versión de Nick Holt.

Solo para los registros, esto se usará en un prototipo y no se ha probado mucho (si es que lo hay).

public class LimitedLinesDocument extends DefaultStyledDocument { private static final long serialVersionUID = 1L; private static final String EOL = "/n"; private final int maxLines; private final int maxChars; public LimitedLinesDocument(int maxLines, int maxChars) { this.maxLines = maxLines; this.maxChars = maxChars; } @Override public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException { boolean ok = true; String currentText = getText(0, getLength()); // check max lines if (str.contains(EOL)) { if (occurs(currentText, EOL) >= maxLines - 1) { ok = false; } } else { // check max chars String[] lines = currentText.split("/n"); int lineBeginPos = 0; for (int lineNum = 0; lineNum < lines.length; lineNum++) { int lineLength = lines[lineNum].length(); int lineEndPos = lineBeginPos + lineLength; System.out.println(lineBeginPos + " " + lineEndPos + " " + lineLength + " " + offs); if (lineBeginPos <= offs && offs <= lineEndPos) { System.out.println("Found line"); if (lineLength + 1 > maxChars) { ok = false; break; } } lineBeginPos = lineEndPos; lineBeginPos++; // for /n } } if (ok) super.insertString(offs, str, attribute); } public int occurs(String str, String subStr) { int occurrences = 0; int fromIndex = 0; while (fromIndex > -1) { fromIndex = str.indexOf(subStr, occurrences == 0 ? fromIndex : fromIndex + subStr.length()); if (fromIndex > -1) { occurrences++; } } return occurrences; } }