Autor
|
Tema: JTextArea Número de línea e Ir a línea específica (Leído 25,986 veces)
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Hola, estoy haciendo un visor de documentos de texto(sí lo sé, es una estupidez, pero quiero practicar un poco de componentes en Java, aparte que tengo cientos de libros en .txt y me sería útil). Bueno, lo que hago para volcar todo al JTextArea es leer el archivo con un Scanner y en cada línea hacer un append al JTextArea, así: File file = fc. getSelectedFile(); filename = file.getAbsolutePath(); lblNameFile.setText(filename); // Leer archivo: Scanner sc = new Scanner(archivo); sc.useDelimiter("\n"); while (sc.hasNext()) { linea = sc.next(); texto.append((linea.isEmpty() ? " " : ++lineNumber) + "\t" + linea + "\n"); } lineNumber = 0; sc.close();
Funciona bien, el problema es que el scroll se va hasta abajo(estamos hablando de unas 3000 líneas por archivo de texto), así que quisiera que aunque todo fuese volcado al JTextArea, el scroll quedará en la primera línea, ¿podrían decirme cómo?Otra cosa, quisiera un método Ir a, ¿hay algo que me permita ir a cierta línea en el JTextArea? Usé este método para obtener el número de línea(algo rústico, pero funciona): while (sc.hasNext()) { linea = sc.next(); texto.append((linea.isEmpty() ? " " : ++lineNumber) + "\t" + linea + "\n"); }
Les dejo todo el código para que lo prueben, de antemano gracias. http://rapidshare.com/files/424244300/TextViewer.javahttp://www.megaupload.com/?d=M5EZAF8XEDITO: He solucionado lo de poner el cursor en la primera línea así: texto.setCaretPosition(0); Ahora me queda otra duda, estoy teniendo problemas al abrir archivos con espacios con el Scanner, ¿alguien sabe como resolverlo?
|
|
« Última modificación: 10 Octubre 2010, 19:43 pm por Leo Gutiérrez. »
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
Es raro no debería darte problemas ya que estas seteando el delimitador a \n mm de todas formas usas el nextLine(). El condicional ternario hace poco hay, si no haces linea.isEmpty() te contaría la linea en blanco. Hice este método que permite ir a una especifica. String []t = area. getText(). split("\n"); int position=0; for(int index=0;index<t.length;index++){ if(index == line-1)break; if(t[index].length()!=0) position+=t[index].length(); } area.setCaretPosition(position+line-1); }
Un saludo.
|
|
« Última modificación: 10 Octubre 2010, 23:14 pm por LEYER »
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Gracias, el único problema es que me pone la línea que quiero al final del JTextArea, tengo que corregir eso.
También me queda corregir que reciba nombres de archivos con espacios.
|
|
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
No la coloca al final, la coloca al inicio
|
|
« Última modificación: 12 Octubre 2010, 09:16 am por LEYER »
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Qué raro, he especificado que vaya a la línea 50 en un archivo que tiene miles de líneas y deja la línea al final del JTextArea. import java.io.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.lang.*; import java.awt.event.*; import java.io.File; import javax.swing.JFileChooser; import javax.swing.*; public class TextViewer extends javax. swing. JFrame { { String []t = area. getText(). split("\n"); int position = 0; for(int index = 0; index < t.length; index++) { if(index == line - 1) break; if(t[index].length() != 0) position += t[index].length(); } area.setCaretPosition(position + line - 1); } { int longitud = 0; Scanner sc = new Scanner(archivo); sc.useDelimiter("\n"); while (sc.hasNext()) { linea = sc.next(); longitud++; } return longitud; } public TextViewer() { add(scroll, gbc); help.setMnemonic('H'); file.setMnemonic('F'); // Elemento del menú "Ayuda". aboutItem.setMnemonic('T'); help.add(aboutItem); openItem.setMnemonic('A'); file.add(openItem); exitItem.setMnemonic('S'); file.add(exitItem); openItem.addActionListener( { { texto.setEditable(false); texto.setText(""); int lineNumber = 0; Filtro filtro = new Filtro(); filtro.addExtension("txt"); filtro.setDescription("Archivos de texto plano : "); fc.setAcceptAllFileFilterUsed(false); fc.setFileFilter(filtro); fc.setDialogTitle("Seleccione el archivo de texto a abrir"); int rc = fc.showDialog(null, "Seleccionar archivo"); { try { File file = fc. getSelectedFile(); filename = file.getAbsolutePath(); lblNameFile.setText(filename); // Leer archivo: Scanner sc = new Scanner(archivo); sc.useDelimiter("\n"); while (sc.hasNext()) { linea = sc.next(); texto.append(++lineNumber + "\t" + linea + "\n"); } //texto.setCaretPosition(0); lineNumber = 0; Ir(50, texto); sc.close(); Logger.getLogger(TextViewer.class.getName()).log(Level.SEVERE, null, ex); JOptionPane. showMessageDialog(null, "Error abriendo la ***** : " + filename ); } } } } );
Saludos. EDITO: Al final queda así: No quiero que los números de línea salgan en el texto, ¿alguna idea de qué componente usar para esto o cómo?
|
|
« Última modificación: 11 Octubre 2010, 00:56 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
Eso es mas complicado de lo que parece , no sabria decirte la forma correcta de hacerlo...habria que chekear el src de jedit
|
|
« Última modificación: 11 Octubre 2010, 22:09 pm por LEYER »
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
He encontrado esto, parece que funciona, voy a ver como lo adhiero al proyecto. import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.text.Document; public class LineNr extends JPanel { public LineNr () { super (); pane = new JTextPane () // we need to override paint so that thelinenumbers stay in sync { { super.paint (g); LineNr.this.repaint (); } }; } { super.paint (g); int start = pane.viewToModel (scrollPane.getViewport ().getViewPosition ()); int end = pane. viewToModel (new Point (scrollPane. getViewport (). getViewPosition (). x + pane.getWidth (), scrollPane.getViewport ().getViewPosition ().y + pane.getHeight ())); int startline = doc.getDefaultRootElement ().getElementIndex (start); int endline = doc.getDefaultRootElement ().getElementIndex (end); int fontHeight = g.getFontMetrics (pane.getFont ()).getHeight (); // font for (int line = startline, y = 0; line <= endline; line++, y += fontHeight) { g. drawString (Integer. toString (line ), 0, y ); } } public static void main (String[]args ) { frame. setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE); final LineNr nr = new LineNr (); frame. getContentPane (). add (nr. scrollPane, BorderLayout. CENTER); frame.pack (); //frame.show(); frame.setVisible (true); }
|
|
|
En línea
|
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Hola, LEYER, estoy teniendo muchos problemas para adaptar el código a mi proyecto, ¿podrías echarme una mano? Te subo el proyecto entero por si deseas echarle un vistazo, yo mientras sigo intentando. http://www.megaupload.com/?d=1W8QBWFVEDITO: Encontré esto, pero no lo logro adaptar a mi código
|
|
« Última modificación: 12 Octubre 2010, 02:40 am por Leo Gutiérrez. »
|
En línea
|
|
|
|
Leyer
Desconectado
Mensajes: 786
leyer@elhacker.net
|
No puedo editar ese code en netbeans por que hay que modificar ciertas cosas de la GUI. ahora bien te dire lo que tienes que hacer. Donde vas a colocar el area de texto, hay vas a hacer un panel sin ningún componente agregado. Luego en el constructor harás lo siguiente. Le quitas el main a LineNr public NewJFrame1() { setTitle("Test"); initComponents(); jPanel1. setLayout(new BorderLayout()); //seteas el layaut del panel creado LineNr s=new LineNr(); jPanel1. add(s. scrollPane, BorderLayout. CENTER); //area de texto pack(); }
Y ya con eso bastaría.
|
|
« Última modificación: 12 Octubre 2010, 09:04 am por LEYER »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Recuperar la ultima linea en un JtextArea
Java
|
deltacompu
|
2
|
6,998
|
14 Diciembre 2010, 13:13 pm
por deltacompu
|
|
|
Consulta~Editar archivo de texto en una linea especifica.
PHP
|
volteo0101
|
3
|
6,963
|
9 Febrero 2011, 07:19 am
por volteo0101
|
|
|
codigo para jTextArea
Dudas Generales
|
willo
|
1
|
2,533
|
20 Agosto 2012, 22:45 pm
por Nasty35
|
|
|
Lectura de Línea a Línea de un archivo de números enteros en C++
Programación C/C++
|
julian21931500
|
7
|
10,496
|
25 Febrero 2015, 04:11 am
por julian21931500
|
|
|
Capturar una linea específica de todo un texto
Java
|
Josebarra
|
2
|
2,639
|
5 Mayo 2015, 04:08 am
por Josebarra
|
|