En este feriado de corpus christi que ya se acaba, aprenderemos a crear un sencillo notepad al estilo de mouse, tendra funciones basicas (abrir/guardar) y la capacidad de trabajar con varios documentos a la vez, a traves de pestañas como se ve en la imagen.
Se necesita:
- Java
- Netbeans 6.0
- 15 minutos de su tiempo
El proyecto comprende:
Comencemos:
1. Cree un nuevo proyecto "texto" en netbeas, añada un JFrame: textoform.java y añade un menu (JMenubar) y sus respectivos Items, ademas añada un contendor JPanel y dentro de el un JTabbedPane:JTP, debe tener algo como esto:
OJO: Fijese en los nombres de los objetos y coloquelos como en la imagen
2. crea una nueva clase textoclass.java, esta clase nos permitira manipular archivos de texto (abrir/guardar) mediante una comoca ventana de dialogo (JFileChooser), el codigo que debes colocar dentro es el siguiente:
package texto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
* @web http://jc-mouse.blogspot.com/
* @author Mouse
*/
public class textoclass {
//para leer
File archivo = null;
FileReader fr = null;
BufferedReader br = null;
//para escribir
FileWriter fichero = null;
PrintWriter pw = null;
//ruta absoluta del archivo a manipular
String ruta = "";
//filtro
private static FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo TXT","txt","TXT");
public textoclass(){
}
//abre un archivo de texto y lee el contenido linea por linea
private String OpenFile(String ruta){
String t="";//contenido del archivo
try {
archivo = new File (ruta);
fr = new FileReader (archivo);
br = new BufferedReader(fr);
// Lectura del fichero linea por linea
String linea;
while((linea=br.readLine())!=null)
t = t + linea + "\n";
}
catch(Exception e){
e.printStackTrace();
}finally{
try{
if( null != fr ){
fr.close();
}
}catch (Exception e2){
e2.printStackTrace();
}
}
return t;
}
private void SaveFile(String t, String ruta){
//se separa el texto cada salto de linea
StringTokenizer st = new StringTokenizer(t,"\n");
try
{
fichero = new FileWriter(ruta);
pw = new PrintWriter(fichero);
//se guarda linea por linea en el archivo
while(st.hasMoreTokens()){
String line = st.nextToken();
pw.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != fichero)
fichero.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
//segun la opcion muestra en pantalla una ventana de dialogo
//para "abrir" o "guardar" un archivo
public String Dialog(String Opcion, JTextArea tArea){
String nombre_archivo="";
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(filter);
//ventana para "abrir un archivo", retorna FALSE si se abre
if (Opcion.equals("Open")){
int result = fileChooser.showOpenDialog(null);
if ( result == JFileChooser.APPROVE_OPTION ){
ruta = fileChooser.getSelectedFile().getAbsolutePath();
nombre_archivo = fileChooser.getSelectedFile().getName();
tArea.setText(OpenFile(ruta));
}
}
//ventana para guardar un archivo
else if (Opcion.equals("Save As")){
int result = fileChooser.showSaveDialog(null);
if ( result == JFileChooser.APPROVE_OPTION ){
ruta = fileChooser.getSelectedFile().getAbsolutePath();
ruta = ruta + ".txt";
nombre_archivo = fileChooser.getSelectedFile().getName();
SaveFile(tArea.getText() ,ruta);
JOptionPane.showMessageDialog(null,"archivo guardado correctamente.");
}
}
//aqui no muestra ninguna ventana, guarda automaticamente el archivo
//respecto a un archivo previamente abierto
else if(Opcion.equals("Save")){
SaveFile(tArea.getText() ,ruta);
JOptionPane.showMessageDialog(null,"archivo actualizado.");
}
return nombre_archivo;
}
}
3. ahora cree una nueva clase JTabbedPane_op.java, esta clase es la encargada de crear nuevas pestañas TABS en el JTabbedPane, asi como su respectivo jTextArea, asi mismo esta clase hace uso de la clase file.java que crearemos mas tarde, esta clase JTabbedPane_op, utiliza vectores para controlar y almacenar las diferenntes pestañas que se crearan, el codigo es:
package texto;
import java.util.Vector;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
/**
* @web http://jc-mouse.blogspot.com/
* @author Mouse
*/
public class JTabbedPane_op {
//vector para almacenar objetos jtextarea
private Vector vjta = new Vector(10,2);
//vector para almacenar objetos tipo file
private Vector vfile = new Vector(10,2);
//objetos
JTextArea jta;
JScrollPane scrollPane;
public JTabbedPane_op(){}
//crea un nuevo TAB en el JTabbedPane junto a un textarea
public void nuevo(JTabbedPane jtp){
//se crea una nueva instancia de jTextArea
jta = new JTextArea(8,25);
//se crean las barras de desplazamiento y se añade el jtextarea
scrollPane = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
//se añade el objeto jtextarea al vector
vjta.add(jta);
vfile.add(new file());
//se optiene la cantidad de tabs que existen
int i = jtp.getComponentCount();
jta.setText("http://jc-mouse.blogspot.com/");
//se añade los objetos al tabs
jtp.add(scrollPane, i);
jtp.setTitleAt(i, "nuevo documento");
}
//obtiene los datos de un jtextarea del tabs actual
public String getdatos(JTabbedPane jtp){
int i = jtp.getSelectedIndex();
JTextArea t = (JTextArea) vjta.elementAt(i);
return t.getText();
}
//retorna un jtextarea del TABS actual
public JTextArea getjTextArea(JTabbedPane jtp){
int i = jtp.getSelectedIndex();
JTextArea t = (JTextArea) vjta.elementAt(i);
return t;
}
//elimina un TABS junto a los demas objetos que le pertenecen
public void eliminar(JTabbedPane jtp){
int i = jtp.getSelectedIndex();
jtp.remove(i);
vjta.remove(i);
vfile.remove(i);
}
//retorna un boolean (true|false) si el contenido de una jtextarea ya
//fue guardado
public boolean fileisnew(JTabbedPane jtp){
file f = (file) vfile.elementAt(jtp.getSelectedIndex());
return f.isnew;
}
//cambia el estado isnew=false despues de que el archivo a sido
//guardado por primera vez
public void guardado(JTabbedPane jtp, String t){
file f = (file) vfile.elementAt(jtp.getSelectedIndex());
jtp.setTitleAt(jtp.getSelectedIndex(), t);
f.isnew=false;
}
}
4. por ultimo cree una nueva clase file.java, esta pequeña clase nos ayuda con la gestion de los archivos
package texto;
public class file {
boolean isnew=true;//condicion boolean
String ruta = "";//ruta del archivo
public file(){}
}
5. para terminar, tenemos que implementar las clases en la interfaz, esto no lo copies y pegues, sino observa la forma de inplementacion:
/* se crean los objetos */
textoclass tc = new textoclass();
JTabbedPane_op op = new JTabbedPane_op();
String title = "Notepad+- by Mouse - file:[";
/* esto en el initComponents */
public textoform() {
initComponents();
this.setTitle(title + "]");
//crea un nuevo tabs junto a una hoja en blanco
op.nuevo(JTP);
}
/* implementacion de las acciones del menu */
private void smOpenActionPerformed(java.awt.event.ActionEvent evt) {
// Abre archivo de texto OPEN FILE
String n = tc.Dialog("Open",op.getjTextArea(JTP));
this.setTitle(title + tc.ruta + "]");
op.guardado(JTP,n);
}
private void smSaveAsActionPerformed(java.awt.event.ActionEvent evt) {
// Guarda en un nuevo archivo GUARDAR COMO...
String n = tc.Dialog("Save As", op.getjTextArea(JTP));
this.setTitle(title + tc.ruta+"]");
if (!n.equals("")){op.guardado(JTP,n);}
}
private void smSaveActionPerformed(java.awt.event.ActionEvent evt) {
// Guarda modificaciones echas a un archivo
//si es nuevo guarda como
if (op.fileisnew(JTP)) {
String n = tc.Dialog("Save As", op.getjTextArea(JTP));
this.setTitle(title + tc.ruta + "]");
if (!n.equals("")){op.guardado(JTP,n);}
}
else
{ //sino actualiza el archivo abierto
String n = tc.Dialog("Save", op.getjTextArea(JTP));
this.setTitle(title + tc.ruta+"]");
}
}
private void smNewActionPerformed(java.awt.event.ActionEvent evt) {
//crea un nuevo tabs junto a una hoja en blanco
op.nuevo(JTP);
}
private void smClosetabActionPerformed(java.awt.event.ActionEvent evt) {
//elimina un tabs
op.eliminar(JTP);
}
Ya tenemos nuestro notepad+- en java
Como siempre los codigos estan extracomentados y tambien te dejo el codigo fuente, cualquier duda o bugs que se encuentre, preguntar y avisar
Mi software nunca tiene fallos. Simplemente desarrolla caracteristicas aleatorias
Se ve, bueno...
ResponderEliminarcordial saludo
ResponderEliminartrato descargarlo pero me genera un error como ya no se encontrara el link de toda manera dejo mi correo geovanny0401@gmail.com
hola esta muy bueno tu codigo. Estoy haciendo un comprobador sintactico para paginas html me servira lo de las pestañas ^_^, como puedo hacer para que me aprescan los numeros de linea a la para de las lineas pero no dentro del documento, no se si me entiendes como en el netbean por ejemplo
ResponderEliminar