Hola amigos Estamos haciendo un miniNavegador y nos surgio la siguiente duda:
Como cargar un documento (un archivo con extensión .html) con contenido hipertextual y que en lugar de tags HTML tendrá tags especiales, las cuales se describen abajo:
Tag especial Significado
<centrado></centrado> Centra el texto que se encuentre dentro de la etiqueta.
<negrita></negrita> Da formato bold al texto que se encuentre dentro de la etiqueta.
<cursiva></cursiva> Da formato de cursiva al texto que se encuentre dentro de la etiqueta.
<subrayado></subrayado> Subraya el texto que se encuentre dentro de la etiqueta.
<liga hacia=""></liga> Permite poner un vínculo a un texto o imagen hacia una página.
<imagen desde="" texto=""></imagen> Permite poner una imagen en el documento con un texto alternativo.
<vineta></vineta> Coloca • viñetas al texto que se encuentre dentro de la etiqueta.
<tachado></tachado> Tacha el texto que se encuentre dentro de la etiqueta.
<letra color="" tamano=""></letra> Da color y tamaño al texto que se encuentre dentro de la etiqueta.
<indice tipo=""></indice> Coloca al texto que se encuentre dentro de la etiqueta como índice, ya sea superíndice o subíndice según el valor del atributo tipo, el cual puede ser sup (para superíndice) o sub (para subíndice).
les dejo el codigo:
/*
* @name: MiniNavegador.java ©Copyleft
* @description: Este es un mini navegador en java
* @author: Eric Corona
* @date: 5 de Diciembre de 2009
* @version: 1.0
*/
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import java.io.IOException;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*; // <-- Esta es el package clave del mininavegador
// Clase que muestra un mini navegador ultra mega sencillo
public class MiniNavegador extends JFrame implements HyperlinkListener {
// Botones de regreso y avance de las páginas:
private JButton backButton, forwardButton;
// Cajita de texto para la URL:
private JTextField locationTextField;
// Esta clase JEditorPane admite texto plano, HTML y RTF
// Permite mezclar fuentes, colores e imágenes
// Permite desplegar contenido HTML al indicarle el tipo de contenido (text/html):
private JEditorPane displayEditorPane;
// Este arreglo sirve para ir haciendo la lista de páginas visitadas:
private ArrayList pageList = new ArrayList();
// Método constructor del MiniNavegador:
public MiniNavegador() {
// Al extender de JFrame, le podemos poner un título de ventana al mini:
super("Mini Navegador Ismael Perea");
// Tamaño (ancho y largo) del mini:
setSize(800, 700);
// Manejo de la salida (exit) del mini:
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
actionExit();
}
});
// Un pequeño menú (lo ideal es que le agreguen la opción de "Abrir archivo"):
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Menú");
fileMenu.setMnemonic(KeyEvent.VK_M);
JMenuItem fileExitMenuItem = new JMenuItem("Salir", KeyEvent.VK_S);
fileExitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionExit();
}
});
fileMenu.add(fileExitMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
// Colocamos en el panel los botones del mini, además de la cajita del URL:
JPanel buttonPanel = new JPanel();
backButton = new JButton("< P'atrás");
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionBack();
}
});
backButton.setEnabled(false);
buttonPanel.add(backButton);
forwardButton = new JButton("P'adelante >");
forwardButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionForward();
}
});
forwardButton.setEnabled(false);
buttonPanel.add(forwardButton);
locationTextField = new JTextField("http://",35);
locationTextField.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionGo();
}
}
});
buttonPanel.add(locationTextField);
JButton goButton = new JButton("Cargar página >>");
goButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionGo();
}
});
buttonPanel.add(goButton);
// Preparamos a JEditorPane para recibir HTML y desplegarlo bonito (con merengue):
displayEditorPane = new JEditorPane();
displayEditorPane.setContentType("text/html"); // <-- EL SECRETO DE TODO
displayEditorPane.setEditable(false);
displayEditorPane.addHyperlinkListener(this);
// Página para precargar:
String paginaInicial = "http://rigel.fca.unam.mx";
String miBlog = "http://aprender.fca.unam.mx/~iperea";
// Creo mi index:
String miIndex = "<html><head><title>Ismael Perea Mini Navegador</title></head><center>";
miIndex += "<body><b>Hola a todos mis alumnos</b><br />" + "<i>Este es mi mini navegador</i><br />";
miIndex += "<font face=\"arial\">Como podrán ver es muy sencillo</font><br />";
miIndex += "<font face=\"courier\">pero funciona</font><br />";
miIndex += "<font size=\"15\">para la clase de progra</font><br />";
miIndex += "<font color=\"red\">y los caprichos del profe gruñon... jejejejeje</font><br />";
miIndex += "<img src=\"file:foto.png\" alt=\"Yo mero\"></img><br />";
miIndex += "<a href=\"" + miBlog + "\">Mi blog</a></center>";
miIndex += "</body></html>";
displayEditorPane.setText(miIndex);
/**************************************************************
try{
displayEditorPane.setPage(paginaInicial);
}catch (IOException e) {
System.err.println("No es posible cargar la página: " + e);
}
***************************************************************/
getContentPane().setLayout(new BorderLayout());
getContentPane().add(buttonPanel, BorderLayout.NORTH);
getContentPane().add(new JScrollPane(displayEditorPane),
BorderLayout.CENTER);
}
// Salir del mini:
private void actionExit() {
System.exit(0);
}
// Para regresar a la página anterior desde la actual:
private void actionBack() {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
try {
showPage(
new URL((String) pageList.get(pageIndex - 1)), false);
} catch (Exception e) {}
}
// Para ir a la página siguiente desde la actual:
private void actionForward() {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
try {
showPage(
new URL((String) pageList.get(pageIndex + 1)), false);
} catch (Exception e) {}
}
// Para cargar y mostrar la página ingresada en el campito de la URL:
private void actionGo() {
URL verifiedUrl = verifyUrl(locationTextField.getText());
if (verifiedUrl != null) {
showPage(verifiedUrl, true);
} else {
showError("¡No es una URL válida!");
}
}
// Mostrar un mensaje de error:
private void showError(String errorMessage) {
JOptionPane.showMessageDialog(this, errorMessage,
"¡¡¡¡ F I J A T E !!!!", JOptionPane.ERROR_MESSAGE);
}
// Verifica el formato de la URL:
private URL verifyUrl(String url) {
// Para que sólo permita URLs que utilicen el protocolo HTTP:
if (!url.toLowerCase().startsWith("http://"))
return null;
// Verifica formato:
URL verifiedUrl = null;
try {
verifiedUrl = new URL(url);
} catch (Exception e) {
return null;
}
return verifiedUrl;
}
// Despliega la página y la agrega a la lista de visitadas:
private void showPage(URL pageUrl, boolean addToList) {
// Muestra el bonito cursor de "espérame" mientras se carga la página:
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
// Obtener la URL de la página actual desplegada:
URL currentUrl = displayEditorPane.getPage();
// Carga la página en el JEditorPane:
displayEditorPane.setPage(pageUrl);
// Obtener la URL de la nueva página desplegada:
URL newUrl = displayEditorPane.getPage();
// Agregar la página a la lista:
if (addToList) {
int listSize = pageList.size();
if (listSize > 0) {
int pageIndex =
pageList.indexOf(currentUrl.toString());
if (pageIndex < listSize - 1) {
for (int i = listSize - 1; i > pageIndex; i--) {
pageList.remove(i);
}
}
}
pageList.add(newUrl.toString());
}
// Actualizar el textito de la URL de la página cargada en ese momento:
locationTextField.setText(newUrl.toString());
// Actualiza los botones según la página cargada en ese momento:
updateButtons();
} catch (Exception e) {
// Mensaje de error:
showError("¡¡¡La página no se puede cargar!!!");
} finally {
// Regresar el cursor a su imagen original:
setCursor(Cursor.getDefaultCursor());
}
}
// Actualiza los botones del P'adelante o P'atrás:
private void updateButtons() {
if (pageList.size() < 2) {
backButton.setEnabled(false);
forwardButton.setEnabled(false);
} else {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
backButton.setEnabled(pageIndex > 0);
forwardButton.setEnabled(
pageIndex < (pageList.size() - 1));
}
}
// Manejo del click en las ligas de las páginas:
public void hyperlinkUpdate(HyperlinkEvent event) {
HyperlinkEvent.EventType eventType = event.getEventType();
if (eventType == HyperlinkEvent.EventType.ACTIVATED) {
if (event instanceof HTMLFrameHyperlinkEvent) {
HTMLFrameHyperlinkEvent linkEvent =
(HTMLFrameHyperlinkEvent) event;
HTMLDocument document =
(HTMLDocument) displayEditorPane.getDocument();
document.processHTMLFrameHyperlinkEvent(linkEvent);
} else {
showPage(event.getURL(), true);
}
}
}
// Correr el mini:
public static void main(String[] args) {
MiniNavegador navegador = new MiniNavegador();
navegador.show();
}
} // Fin de la clase
Como cargar un documento (un archivo con extensión .html) con contenido hipertextual y que en lugar de tags HTML tendrá tags especiales, las cuales se describen abajo:
Tag especial Significado
<centrado></centrado> Centra el texto que se encuentre dentro de la etiqueta.
<negrita></negrita> Da formato bold al texto que se encuentre dentro de la etiqueta.
<cursiva></cursiva> Da formato de cursiva al texto que se encuentre dentro de la etiqueta.
<subrayado></subrayado> Subraya el texto que se encuentre dentro de la etiqueta.
<liga hacia=""></liga> Permite poner un vínculo a un texto o imagen hacia una página.
<imagen desde="" texto=""></imagen> Permite poner una imagen en el documento con un texto alternativo.
<vineta></vineta> Coloca • viñetas al texto que se encuentre dentro de la etiqueta.
<tachado></tachado> Tacha el texto que se encuentre dentro de la etiqueta.
<letra color="" tamano=""></letra> Da color y tamaño al texto que se encuentre dentro de la etiqueta.
<indice tipo=""></indice> Coloca al texto que se encuentre dentro de la etiqueta como índice, ya sea superíndice o subíndice según el valor del atributo tipo, el cual puede ser sup (para superíndice) o sub (para subíndice).
les dejo el codigo:
/*
* @name: MiniNavegador.java ©Copyleft
* @description: Este es un mini navegador en java
* @author: Eric Corona
* @date: 5 de Diciembre de 2009
* @version: 1.0
*/
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import java.io.IOException;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.html.*; // <-- Esta es el package clave del mininavegador
// Clase que muestra un mini navegador ultra mega sencillo
public class MiniNavegador extends JFrame implements HyperlinkListener {
// Botones de regreso y avance de las páginas:
private JButton backButton, forwardButton;
// Cajita de texto para la URL:
private JTextField locationTextField;
// Esta clase JEditorPane admite texto plano, HTML y RTF
// Permite mezclar fuentes, colores e imágenes
// Permite desplegar contenido HTML al indicarle el tipo de contenido (text/html):
private JEditorPane displayEditorPane;
// Este arreglo sirve para ir haciendo la lista de páginas visitadas:
private ArrayList pageList = new ArrayList();
// Método constructor del MiniNavegador:
public MiniNavegador() {
// Al extender de JFrame, le podemos poner un título de ventana al mini:
super("Mini Navegador Ismael Perea");
// Tamaño (ancho y largo) del mini:
setSize(800, 700);
// Manejo de la salida (exit) del mini:
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
actionExit();
}
});
// Un pequeño menú (lo ideal es que le agreguen la opción de "Abrir archivo"):
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("Menú");
fileMenu.setMnemonic(KeyEvent.VK_M);
JMenuItem fileExitMenuItem = new JMenuItem("Salir", KeyEvent.VK_S);
fileExitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionExit();
}
});
fileMenu.add(fileExitMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
// Colocamos en el panel los botones del mini, además de la cajita del URL:
JPanel buttonPanel = new JPanel();
backButton = new JButton("< P'atrás");
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionBack();
}
});
backButton.setEnabled(false);
buttonPanel.add(backButton);
forwardButton = new JButton("P'adelante >");
forwardButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionForward();
}
});
forwardButton.setEnabled(false);
buttonPanel.add(forwardButton);
locationTextField = new JTextField("http://",35);
locationTextField.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionGo();
}
}
});
buttonPanel.add(locationTextField);
JButton goButton = new JButton("Cargar página >>");
goButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionGo();
}
});
buttonPanel.add(goButton);
// Preparamos a JEditorPane para recibir HTML y desplegarlo bonito (con merengue):
displayEditorPane = new JEditorPane();
displayEditorPane.setContentType("text/html"); // <-- EL SECRETO DE TODO
displayEditorPane.setEditable(false);
displayEditorPane.addHyperlinkListener(this);
// Página para precargar:
String paginaInicial = "http://rigel.fca.unam.mx";
String miBlog = "http://aprender.fca.unam.mx/~iperea";
// Creo mi index:
String miIndex = "<html><head><title>Ismael Perea Mini Navegador</title></head><center>";
miIndex += "<body><b>Hola a todos mis alumnos</b><br />" + "<i>Este es mi mini navegador</i><br />";
miIndex += "<font face=\"arial\">Como podrán ver es muy sencillo</font><br />";
miIndex += "<font face=\"courier\">pero funciona</font><br />";
miIndex += "<font size=\"15\">para la clase de progra</font><br />";
miIndex += "<font color=\"red\">y los caprichos del profe gruñon... jejejejeje</font><br />";
miIndex += "<img src=\"file:foto.png\" alt=\"Yo mero\"></img><br />";
miIndex += "<a href=\"" + miBlog + "\">Mi blog</a></center>";
miIndex += "</body></html>";
displayEditorPane.setText(miIndex);
/**************************************************************
try{
displayEditorPane.setPage(paginaInicial);
}catch (IOException e) {
System.err.println("No es posible cargar la página: " + e);
}
***************************************************************/
getContentPane().setLayout(new BorderLayout());
getContentPane().add(buttonPanel, BorderLayout.NORTH);
getContentPane().add(new JScrollPane(displayEditorPane),
BorderLayout.CENTER);
}
// Salir del mini:
private void actionExit() {
System.exit(0);
}
// Para regresar a la página anterior desde la actual:
private void actionBack() {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
try {
showPage(
new URL((String) pageList.get(pageIndex - 1)), false);
} catch (Exception e) {}
}
// Para ir a la página siguiente desde la actual:
private void actionForward() {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
try {
showPage(
new URL((String) pageList.get(pageIndex + 1)), false);
} catch (Exception e) {}
}
// Para cargar y mostrar la página ingresada en el campito de la URL:
private void actionGo() {
URL verifiedUrl = verifyUrl(locationTextField.getText());
if (verifiedUrl != null) {
showPage(verifiedUrl, true);
} else {
showError("¡No es una URL válida!");
}
}
// Mostrar un mensaje de error:
private void showError(String errorMessage) {
JOptionPane.showMessageDialog(this, errorMessage,
"¡¡¡¡ F I J A T E !!!!", JOptionPane.ERROR_MESSAGE);
}
// Verifica el formato de la URL:
private URL verifyUrl(String url) {
// Para que sólo permita URLs que utilicen el protocolo HTTP:
if (!url.toLowerCase().startsWith("http://"))
return null;
// Verifica formato:
URL verifiedUrl = null;
try {
verifiedUrl = new URL(url);
} catch (Exception e) {
return null;
}
return verifiedUrl;
}
// Despliega la página y la agrega a la lista de visitadas:
private void showPage(URL pageUrl, boolean addToList) {
// Muestra el bonito cursor de "espérame" mientras se carga la página:
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
// Obtener la URL de la página actual desplegada:
URL currentUrl = displayEditorPane.getPage();
// Carga la página en el JEditorPane:
displayEditorPane.setPage(pageUrl);
// Obtener la URL de la nueva página desplegada:
URL newUrl = displayEditorPane.getPage();
// Agregar la página a la lista:
if (addToList) {
int listSize = pageList.size();
if (listSize > 0) {
int pageIndex =
pageList.indexOf(currentUrl.toString());
if (pageIndex < listSize - 1) {
for (int i = listSize - 1; i > pageIndex; i--) {
pageList.remove(i);
}
}
}
pageList.add(newUrl.toString());
}
// Actualizar el textito de la URL de la página cargada en ese momento:
locationTextField.setText(newUrl.toString());
// Actualiza los botones según la página cargada en ese momento:
updateButtons();
} catch (Exception e) {
// Mensaje de error:
showError("¡¡¡La página no se puede cargar!!!");
} finally {
// Regresar el cursor a su imagen original:
setCursor(Cursor.getDefaultCursor());
}
}
// Actualiza los botones del P'adelante o P'atrás:
private void updateButtons() {
if (pageList.size() < 2) {
backButton.setEnabled(false);
forwardButton.setEnabled(false);
} else {
URL currentUrl = displayEditorPane.getPage();
int pageIndex = pageList.indexOf(currentUrl.toString());
backButton.setEnabled(pageIndex > 0);
forwardButton.setEnabled(
pageIndex < (pageList.size() - 1));
}
}
// Manejo del click en las ligas de las páginas:
public void hyperlinkUpdate(HyperlinkEvent event) {
HyperlinkEvent.EventType eventType = event.getEventType();
if (eventType == HyperlinkEvent.EventType.ACTIVATED) {
if (event instanceof HTMLFrameHyperlinkEvent) {
HTMLFrameHyperlinkEvent linkEvent =
(HTMLFrameHyperlinkEvent) event;
HTMLDocument document =
(HTMLDocument) displayEditorPane.getDocument();
document.processHTMLFrameHyperlinkEvent(linkEvent);
} else {
showPage(event.getURL(), true);
}
}
}
// Correr el mini:
public static void main(String[] args) {
MiniNavegador navegador = new MiniNavegador();
navegador.show();
}
} // Fin de la clase