Esta semana estamos tocando el tema de interfaces gráficas asi que voy a intentar explicar como funciona la parte grafica de mi proyecto para esto pondré partes del código y abajo un link al código por si alguien encuntra algo que le interese para su proyecto.
Bien para empezar explicare la estructura de clases de mi programa respecto a la interfaz gráfica. Para no tener problemas con esta parte del programa al empezar a diseñarlo incluí una clase dedicada a la interfaz gráfica que es la clase GUI pero no es suficiente explicar esta por que no es la unica clase que interactua directamente con el usuario y ademas de que tenia que saber la forma adecuada.
Las dos clases que interactuan directamente con el usuario son la clase Sheet y GUI. La primera se encarga de desplegar en pantalla el campo de trabajo para el texto, cuando el usuario abre un archivo el texto se muestra en esta área y hace posible la edición del texto por el usuario. La segunda clase se encarga de implementar los menús, La pantalla, información de ejecución y casi cualquier cosa de la interfaz de la cual no se encarga la clase Sheet.
La todos los componentes se agregan al JFrame que se encuentra en la clase GUI y eso me dio problemas con la clase Sheet puesto que esa interactúa directamente con la clase TextManager así que es implementada ahí pero es agregada a la ventana en GUI entonces para arreglar esto las dos clases comparten un JTabbedPane que me sirve como lista para agregar los Sheet de cada archivo que se abra ademas que permite cierta interacción entre la clase GUI y TextManager.
Para poder trabajar fácilmente con los archivos de cada hoja agregada al componente JTabbedPane hice una clase que junta la hoja de trabajo, el archivo y el nombre del archivo. Esta clase es heredada de la clase JScrollPane asi cuando el usuario quiera guardar un archivo o cerrarlo o hacer cualquier cambie al archivo, el programa solo tiene que devolver el Tab con el que se trabaja actualmente para realizar cualquiera de esas acciones.
La clase GUI se encarga de desplegar los menús en la pantalla así como mostrar información de el programa y es hija de la clase JTextPane. Los componentes implementados aqui son:
- JFrame que es la clase que se hereda para crear esta.
- JPanel sirve como contenedor de otros componentes o como fondo del programa.
- JMenuBar permite crear un menú desplegable.
- JMenu permite agregar elementos que despliegan listas de botones al JMenuBar .
- JMenuItem permite agregar botones al JMenuBar.
- JSeparator es una linea que separa unos botones de otros en el JMenuBar.
- JLabel un componente despliega texto o imágenes.
package mxText;
public class GUI extends javax.swing.JFrame{
private int numerodeBotones;
private static GUI instancia = null;
private Sheet texto;
JPanel p1, p2, p3;
JMenuBar barraMenu;
static JLabel label= new JLabel("");
String[] jMenu={"Archivo","Editar","Abrir","Nuevo","Guardar","Guardar Como"};
private GUI(String titulo, JTabbedPane tabs){
super(titulo);
super.setTitle(titulo);
super.setLocation(0,0);
super.setSize(500,500);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setLayout(new BorderLayout());
p1 = new JPanel();
p2 = new JPanel();
super.add(p1,BorderLayout.CENTER);
p1.setLayout(new BorderLayout());
this.texto = texto;
//JScrollPane scrollb = new JScrollPane(this.texto);
//JTabbedPane tabs = tabs;
p1.setPreferredSize(new Dimension(20,5));
barraMenu = new JMenuBar();
super.add(p2,BorderLayout.NORTH);
super.add(label,BorderLayout.SOUTH);
super.setJMenuBar(barraMenu);
//tabs.addTab("archivo 1",scrollb);
p1.add(tabs, BorderLayout.CENTER);
super.setVisible(true);
}
/**
* Es la clase que prepara todos los componentes para e imprime en la pantalla.
*/
public void barraPrincipal(TextManager listener){
JMenu archivo = new JMenu(jMenu[0]);
JMenu editar = new JMenu(jMenu[1]);
JMenu buscar = new JMenu("Buscar");
barraMenu.add(archivo);
barraMenu.add(editar);
barraMenu.add(buscar);
JMenuItem abrir = new JMenuItem(jMenu[2]);
JMenuItem nuevo = new JMenuItem(jMenu[3]);
JMenuItem guardar = new JMenuItem(jMenu[4]);
JMenuItem guardarComo = new JMenuItem(jMenu[5]);
JMenuItem buscari = new JMenuItem("Buscar");
JMenuItem remplazar = new JMenuItem("Remplazar");
abrir.addActionListener(listener);
abrir.setActionCommand("abrir");
nuevo.addActionListener(listener);
nuevo.setActionCommand("nuevo");
guardar.addActionListener(listener);
guardar.setActionCommand("guardar");
guardarComo.addActionListener(listener);
guardarComo.setActionCommand("guardarComo");
buscar.add(buscari);
buscar.add(remplazar);
archivo.add(nuevo);
archivo.add(abrir);
archivo.add(new JSeparator());
archivo.add(guardar);
archivo.add(guardarComo);
}
};
La clase Sheet muestra el area de trabajo para mostrar y editar el texto de un archivo.Los componentes implementados aqui son:
- JTextPane es el área utilizada para trabajar con el texto.
- CaretUpdate un escuchador que se activa cada que se mueve el caret de el JTextPane
- ScrollBar dibuja una barra para que se pueda mostrar todo el contenido del JTextPane.
package mxText;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.Color;
import java.util.Hashtable;
import javax.swing.event.*;
/**
* Esta clase es una extencion de una herramienta que sirve de interfaz
* entre el usuario y el programa. Es una area donde se ingresa y se edita
* el texto de archivos.
*@author Max Hernandez
*/
class Sheet extends javax.swing.JTextPane implements CaretListener { // Una pare de la interfaz grafica y sabe estructurar el texto en la pantalla
Hashtable colores = new Hashtable();
StyleContext sc = new StyleContext();
DefaultStyledDocument doc = new DefaultStyledDocument(sc);
JTextPane pane = new JTextPane(doc);
public void caretUpdate(CaretEvent e){
String[] lista = {"int","null","void","extends","implements"};
int valores[] = this.procesadorColumnas(super.getCaretPosition());
System.out.println("Ln "+valores[0]+" Col "+valores[1]);
GUI.label.setText("Ln "+valores[0]+" Col "+valores[1]);
}
public Sheet(){
super();
super.addCaretListener(this);
}
private void anadirColor(String colorString, Color colorAwt ){
Style color = sc.addStyle("ConstantWidth", null);
StyleConstants.setForeground(color, colorAwt);
colores.put(colorString, color);
}
private int[] procesadorColumnas(int n){
String text1 = super.getText();
char text[] =text1.toCharArray();
int cont=0, valores[]={0,0};
for(int i=0;i
Saludos.


Hola max que tal
ResponderBorrarestaba pensando que también podrías implementar un tipo de KeyListener para por ejemplo que el usuario pulse las teclas CTRL + T y habra un nuevo documento en una nueva pestaña aquí te dejo un link de como se implementan los KeyListener
http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html
Saludos (:
eit que tal, lo del key listener se oye muy bueno, aver si le pongo algo así a mi proyecto, también estaría muy bueno que el programa fuera capaz de abrir los archivos y montarlos sobre la interfaz para seguir editandolos, me gustaría saber en que tipo de archivos guardas el texto.
ResponderBorrarsaludos!
Que tal Max, pues unas capturas de pantalla no hubieran estado nada mal :P sugeriria no se si solo como "plus" pudieras agregar lo de utilizar distintos tipos de fuentes y/o tamaños para hacerlo más atractivo al igual de no olvidar lo de seleccionar texto o todo el texto con el mouse y el copy/paste!!! que todavia es más importante que el for jeje no sé si estas implementaciones ya las tengas pero si no pues hay te las dejo como sugerencias n_n
ResponderBorrarSaludos!
Hola max te esta quedando genial :D
ResponderBorrarsolo una sugerencia seria genial que le implementarías un KeyListener para por ejemplo el usuario pulse las teclas de CTRL + T y automáticamente se habra un nuevo documento en un nueva pestalla por decir un ejemplo y como dijo este adan también el clasido CTRL + C y CTRL + V
solo es una sugerencias :D
aquí te dejo unos ejemplos de Keylistener
http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html
Saludos (:
Estoy de acuerdo con Adán; 7 por la entrada. Punto extra para Adán y otro para Alex por su excelente sugerencia.
ResponderBorrar