Editor de Texto

Este es un Editor de texto escrito en java, bastante sencillo pero que puede servir de base para algo mas serio.
Consta de dos clases, ambas en el paquete com.dansan.editor.
Quizas lo mas importante este en el hecho de guardar el objeto de la clase JTextPane en un archivo para luego recuperarlo al abrirlo. Esto es gracias que dicha clase implementa la interface Serializable.
Los demas solo es aplicar ciertas cambios al texto seleccionado mediante SimpleAttributeSet y StyleConstants.


EditorTexto.java



package com.dansan.editor;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;


/*
  * Autor: Daniel Alberto Sanchez
  * Fecha: 05/08/2013
  * Descripcion: Editor de texto
  */

public class EditorTexto extends JFrame implements ActionListener {
 
 private String auxtexto;
 private JTextPane area;
 private JMenuBar barraMenu;
 private JMenu archivo,edicion;
 private JMenuItem abrir,salir,copiar,cortar,pegar,guardar,fuente,imagen;
 private JScrollPane panel;
 private BorderLayout bl;
 private File f;
 
 public EditorTexto(){
  super("Editor de texto");
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  this.setSize(800,600);
  bl = new BorderLayout();
  this.setLayout(bl);
  barraMenu = new JMenuBar();
  archivo = new JMenu("ARCHIVO");
  edicion = new JMenu("EDICION");
  barraMenu.add(archivo);
  barraMenu.add(edicion);
  abrir = new JMenuItem("Abrir");
  guardar = new JMenuItem("Guardar");
  salir = new JMenuItem("Salir");
  copiar = new JMenuItem("Copiar");
  cortar = new JMenuItem("Cortar");
  pegar = new JMenuItem("Pegar");
  fuente = new JMenuItem("Fuente");
  imagen = new JMenuItem("Imagen");
  archivo.add(abrir);
  archivo.add(guardar);
  archivo.addSeparator();
  archivo.add(salir);
  edicion.add(copiar);
  edicion.add(cortar);
  edicion.add(pegar);
  edicion.add(fuente);
  edicion.add(imagen);
  area = new JTextPane();
  panel = new JScrollPane(area);
  this.add(panel,bl.CENTER);
  area.setSize(600,600);
  this.setJMenuBar(barraMenu);
  abrir.addActionListener(this);
  guardar.addActionListener(this);
  salir.addActionListener(this);
  copiar.addActionListener(this);
  cortar.addActionListener(this);
  pegar.addActionListener(this);
  fuente.addActionListener(this);
  imagen.addActionListener(this);
  this.setVisible(true);
 }
 
 //metodo de la interface ActionListener
 
 public void actionPerformed(ActionEvent ae) {
  if(ae.getSource()==copiar){
   area.copy();
  }else if(ae.getSource()==pegar){
   area.paste();
  }else if(ae.getSource()==cortar){
   area.cut();
  }else if(ae.getSource()==salir){
   this.dispose();
  }else if(ae.getSource()==abrir){
   JFileChooser jfc = new JFileChooser();
   int resultado = jfc.showOpenDialog(this);
   if(resultado == JFileChooser.APPROVE_OPTION){
    f = jfc.getSelectedFile();
    try{
     FileInputStream fis = new FileInputStream(f.getAbsolutePath());
     ObjectInputStream ois = new ObjectInputStream(fis);
     JTextPane textPaneAux = (JTextPane) ois.readObject();
     this.area.setStyledDocument(textPaneAux.getStyledDocument());
     fis.close();
    }catch(Exception ex){
     ex.printStackTrace();
    }
   }
  }else if(ae.getSource()==guardar){
   JFileChooser jfc = new JFileChooser();
   int resultado = jfc.showSaveDialog(this);
   if(resultado == JFileChooser.APPROVE_OPTION){
    f = jfc.getSelectedFile();
    try{
     FileOutputStream fos = new FileOutputStream(f.getAbsolutePath());
     ObjectOutputStream oos = new ObjectOutputStream(fos);
     //Esto es posible porque JTextPane implementa la clase Serializable
     oos.writeObject(area);
     oos.flush();
     oos.close();
    }catch(Exception ex){
     ex.printStackTrace();
    }
   }
  }else if(ae.getSource()==fuente){
   Fuente f = new Fuente(this);
  }else if(ae.getSource()==imagen){
   JFileChooser jfc = new JFileChooser();
   int resultado = jfc.showOpenDialog(this);
   if(resultado == JFileChooser.APPROVE_OPTION){
    f = jfc.getSelectedFile();
    }
   this.area.insertIcon(new ImageIcon(f.getAbsolutePath()));
  }
 }
 

 // metodos getter and setter que devuelven el JTextPane
 
 public JTextPane getArea() {
  return area;
 }


 public void setArea(JTextPane area) {
  this.area = area;
 }

 //metodo main

 public static void main(String[] args) {
  EditorTexto principal = new EditorTexto();
 }
}

Fuente.java


package com.dansan.editor;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;


public class Fuente extends JDialog implements ActionListener{
 
 EditorTexto editor;
 JToggleButton negrita,cursiva,subrayado;
 JButton aceptar, cancelar;
 JComboBox tamano,familia;
 SimpleAttributeSet attrs;
 String fuentes[];
 JColorChooser colores;
 JPanel panelOpciones,panelBotones;
 
 public Fuente(EditorTexto editor){
  this.setTitle("Fuente");
  this.editor=editor;
  this.setSize(500,500);
  this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  this.setLayout(new BorderLayout());
  //Agrego botones de seleccion
  panelOpciones = new JPanel(new FlowLayout());
  negrita= new JToggleButton("N");
  cursiva= new JToggleButton("C");
  subrayado= new JToggleButton("S");
  panelOpciones.add(negrita);
  panelOpciones.add(cursiva);
  panelOpciones.add(subrayado);
  tamano = new JComboBox();
  familia = new JComboBox();
  for(int i=10;i<=48;i++)tamano.addItem(new Integer(i));
  panelOpciones.add(tamano);
  //cargo las funetes disponibles del sistema
  GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
  fuentes= environment.getAvailableFontFamilyNames();
  familia=new JComboBox(fuentes);
  panelOpciones.add(familia);
  colores = new JColorChooser();
  panelOpciones.add(colores);
  this.add(panelOpciones,BorderLayout.CENTER);
  panelBotones = new JPanel(new FlowLayout());
  aceptar = new JButton("Aceptar");
  cancelar = new JButton("Cancelar");
  panelBotones.add(aceptar);
  panelBotones.add(cancelar);
  this.add(panelBotones,BorderLayout.SOUTH);
     attrs = new SimpleAttributeSet();
     aceptar.addActionListener(this);
     cancelar.addActionListener(this);
     
  this.setVisible(true);
 }
 
 //metodo de la interface ActionListener

 public void actionPerformed(ActionEvent e) {
  if(e.getSource()==aceptar){
   if(negrita.isSelected())StyleConstants.setBold(attrs, true);
   if(cursiva.isSelected())StyleConstants.setItalic(attrs, true);
   if(subrayado.isSelected())StyleConstants.setUnderline(attrs, true);
   StyleConstants.setForeground(attrs, colores.getColor());
   StyleConstants.setFontFamily(attrs, familia.getSelectedItem().toString());
   StyleConstants.setFontSize(attrs, Integer.parseInt(tamano.getSelectedItem().toString()));
   if(editor.getArea().getSelectedText() != null)
    editor.getArea().getStyledDocument().setCharacterAttributes(editor.getArea().getSelectionStart(), editor.getArea().getSelectedText().length(), attrs, true); 
   this.dispose();
  }else if(e.getSource()==cancelar){
   this.dispose();
  }
 }
 
}

diagrama generado con ObjectAid UML



 

Capturas del programa funcionando

 



 


Descargar editor.jar

https://drive.google.com/file/d/0B0sBXdZ8aJgdS2J2aEdPblpYTVU/edit?usp=sharing




Comentarios