viernes, 20 de abril de 2007

JTable

En muchas ocasiones necesitamos representar una gran cantidad de datos con un JTable con un scroll muy lento y un gran consumo de memoria y recursos.

A continuación el siguiente manual que explica como realiar esta tarea de la forma más optima posible. Este manual es básico para utiizar de forma adecuada un gran volumen de datos en una aplicación en java JTable

lunes, 26 de marzo de 2007

Numero de cifras

Este ejercicio en java divide un números sucesivamente hasta conseguir
el número de cifras que tiene un entero.

Por ejemplo si tu introduces el número 3454 el programa te devolverá
un 4.


import java.io.*;

class Cifras {

static int total=0;
static int x=0;

static int numCifras(int x){
while(x!=0){
x=x/10;
total+=1; //incrementamos el contador
}
return total;
}

public static void main(String[]args) throws IOException{
//BufferedReader para leer de consola
BufferedReader leer = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Introduce un nu4mero:");
//leemos una línea como string
String linea = leer.readLine();
/*Convertirmos el string a un número. Podrías poner
*un try y catch para comprobrar errores al convertirlo.Por
*ejemplo si introducen un string*/
x= Integer.parseInt(linea);
System.out.println("El numero de cifras es:");
//Imprimimos el número de líneas
System.out.println(numCifras(x));
}
}

Buscar en archivos java

Barras de progreso JProgressBar y aplicaciones gráficas

Este ejemplo busca coincidencias en los archivos a partir de un directorio
especificado por el usuario.

Problema:
Si tenemos una aplicaciones que realiza un proceso que consume un tiempo relativamente largo, es bueno hacer saber al usuario de la aplicacion que la tarea esta siendo procesada y mas o menos el tiempo que queda, lo tipico del mensaje:'El proceso va por el 20%' por ejemplo.

Las librerias de Swing en java, tiene unos mecanismos para mostrar este progreso, vamos a hacer un ejemplo de una aplicacion que busca una cadena de texto en todos los ficheros de un directorio espedificado.

Fuente original: telepolis.com

import java.awt.GridLayout;
import java.awt.Cursor;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.lang.reflect.InvocationTargetException; public class ProgressDemo {

String startdir; // directorio de busqueda
String patt; // lo que vamos a buscar
JTextArea outarea; // output area for file pathnames
JFrame frame; // frame
JProgressBar progbar; // barra de progreso
JLabel fileslab; // numero de ficheros encontrado
boolean search_flag; // true si la busqueda esta en progreso

class Search extends Thread
{

// actualiza el GUI
void doUpdate(Runnable r) {
try {
SwingUtilities.invokeAndWait(r);
}
catch (InvocationTargetException e1) {
System.err.println(e1);
}
catch (InterruptedException e2) {
System.err.println(e2);
}
}
// nos da la lista de los ficheros de un directorio
void getFileList(File f, List list) {

// recursividad si hay un directorio dentro del mismo
if (f.isDirectory()) {
String entries[] = f.list();
for (int i = 0; i < entries.length; i++) {
getFileList(new File(f, entries[i]),
list);
}
}

// para fciheros , se añaden a la lista y se actualiza la barra de progreso
else if (f.isFile()) {
list.add(f.getPath());
final int size = list.size();
if (size % 100 != 0) {
return;
}
doUpdate(new Runnable() {
public void run() {
progbar.setValue(size % 1000);
}
});
}
}

// comprueba que el fichero contiene la cadena
boolean fileMatch(String fn, String patt) {
boolean found = false;

try {
FileReader fr = new FileReader(fn);
BufferedReader br = new BufferedReader(fr);
String str;
while ((str = br.readLine()) != null) {
if (str.indexOf(patt) != -1) {
found = true;
break;
}
}
br.close();
}
catch (IOException e) {
System.err.println(e);
}
return found;
}



// realiza la busqueda
public void run() {
List filelist = new ArrayList();
final String sep =
System.getProperty("line.separator");

doUpdate(new Runnable() {
public void run() {
outarea.setText("");
fileslab.setText("");
}
});

// nos da la lista de todos los ficheros y muestra el contador
getFileList(new File(startdir), filelist);
final int size = filelist.size();
doUpdate(new Runnable() {
public void run() {
progbar.setValue(0);
fileslab.setText("Encontrados " + size +
" ficheros, buscando ...");
}
});

// configura el monitor de progreso
final ProgressMonitor pm = new ProgressMonitor(
frame, "Buscando ficheros", "", 0, size - 1);
pm.setMillisToDecideToPopup(0);
pm.setMillisToPopup(0);

// itera entre los ficheros, actualizando el monitor de progreso
for (int i = 0; i < size; i++) {
final String fn = (String)filelist.get(i);
final int curr = i;
if (pm.isCanceled()) {
break;
}
final boolean b = fileMatch(fn, patt);
doUpdate(new Runnable() {
public void run() {
pm.setProgress(curr);
pm.setNote(fn);
if (b) {
outarea.append(fn + sep);
}
}
});
}

doUpdate(new Runnable() {
public void run() {
pm.close();
outarea.setCaretPosition(0);
fileslab.setText("");
}
});
search_flag = false;
}
}

public ProgressDemo() {
frame = new JFrame("ProgressDemo");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});



JPanel paneltop = new JPanel();
JPanel panelbot = new JPanel();
paneltop.setLayout(new GridLayout(5, 1));
JPanel panel1 = new JPanel();
panel1.add(new JLabel("Directorio inicial"));
final JTextField dirfield = new JTextField(20);
panel1.add(dirfield);
JPanel panel2 = new JPanel();
panel2.add(new JLabel("Patron de busqueda"));
final JTextField pattfield = new JTextField(20);
panel2.add(pattfield);
JPanel panel3 = new JPanel();
JButton button = new JButton("Search");
panel3.add(button);
JPanel panel4 = new JPanel();
progbar = new JProgressBar(0, 999);
panel4.add(progbar);
JPanel panel5 = new JPanel();
fileslab = new JLabel();
panel5.add(fileslab);
JPanel panel6 = new JPanel();
outarea = new JTextArea(8, 40);
outarea.setEditable(false);
JScrollPane jsp = new JScrollPane(outarea,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel6.add(jsp);

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
startdir = dirfield.getText();
patt = pattfield.getText();
if (startdir == null ||
startdir.trim().equals("") ||
patt == null ||
patt.trim().equals("")) {
JOptionPane.showMessageDialog(
frame, "Entrada invalida", "Error",
JOptionPane.ERROR_MESSAGE);
}
else if (search_flag) {
JOptionPane.showMessageDialog(
frame, "Busqueda en progreso",
"Error", JOptionPane.ERROR_MESSAGE);
}
else {
search_flag = true;
new Search().start();
}
}
});

paneltop.add(panel1);
paneltop.add(panel2);
paneltop.add(panel3);
paneltop.add(panel4);
paneltop.add(panel5);
panelbot.add(panel6);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 1));
panel.add(paneltop);
panel.add(panelbot);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocation(200, 200);
frame.setVisible(true);
}

public static void main(String args[]) {
new ProgressDemo();
}
}

jueves, 15 de marzo de 2007

GridLayout

El GridLayout es una forma de situar los componentes con gran flexibilidad en el panel.
con setLayout(new GridLayout(Fila,Columna)); puedes establecer un layout con el número de Filas y Columnas y los componentes se añaden dentro de las celdas definidas.

En el siguiente ejemplo se colocan los componentes en una rejilla que ocupa todo el frame y coloca cuatro botones en su respectiva celda.

import javax.swing.*;
import java.awt.*;


class Ejemplo extends JFrame {
JButton uno = new JButton("uno");
JButton dos = new JButton("dos");
JButton tres = new JButton("tres");
JButton cuatro = new JButton("cuatro");

Menu(){
this.setLayout(new GridLayout(2,2));
add(uno);
add(dos);
add(tres);
add(cuatro);

setTitle("Ejemplos de GridLayout");
setSize(400,400);
setVisible(true);
}

public static void main (String []args){
new Ejemplo();
}

}

martes, 13 de marzo de 2007

FlowLayout

El FlowLayout es el método más simple de colocar los componentes dentro de un Panel o un Jpanel en java. Cada uno de los componentes de un panel que se encuentran en FlowLayout se encuentran situados de izquierda a derecha como en una lista, unos a continuación de los otros, saltando hacia abajo cuando no hay espacio suficiente para ese componente.

FlowLayout pertenece a java.awt, pero tambien se puede aplicar a swing, por ejemplo como en este caso a un JPanel.

Un ejemplo de la utilización del FlowLayout en un programa para colocar tres botones en un panel.


import javax.swing.*;
import java.awt.*;


class Ejemplo extends JFrame {
JButton primero = new JButton("Primero");
JButton anterior = new JButton("Anterior");
JButton siguiente = new JButton("Siguiente");
JButton ultimo = new JButton("Ultimo");

Ejemplo(){
//Añadimos el formato de FlowLayout al JFrame
this.setLayout(new FlowLayout());
//Añadimos componentes
add(primero);
add(anterior);
add(siguiente);
add(ultimo);

setTitle("Ejemplos FlowLayout");
setSize(400,400);
setVisible(true);
}

public static void main (String []args){
new Ejemplo();
}

}

lunes, 12 de marzo de 2007

Añadir scroll a JTextArea

Con este código podras insertar unas barras de scroll en un JTextArea tal y como cualquier editor de texto.

Sea Texto un JTextArea y zonaText un JPanel el que va insertado la caja de texto el ejemplo de como insertar scroll en una caja de texto queda de la siguiente forma.

Código:

//Añadir barras de scroll a la caja de texto principal
JScrollPane textScroll=new JScrollPane(Texto,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
zonaText.add(textScroll);

sábado, 3 de marzo de 2007

JToolBar en java

Ejmplo del uso de una JToolBar. Coloca una barra de herramientas en tu programas en java. Lo más normal es insertar una ImageIcon (icono) que represente la acción que realiza el botón.

Por ejemplo para insertar una imagen en el botón de guardar utilizaremos:
ImageIcon ImagenGuardar=new ImageIcon("guardar.gif");
BGuardar.setIcon(ImagenGuardar);


import javax.swing.*;

class Menu extends JFrame {
//Toolbar
JToolBar TBarra=new JToolBar();
JButton BNuevo=new JButton("N");
JButton BAbrir=new JButton("A");
JButton BCopiar=new JButton("C");
JButton BCortar=new JButton("C");
JButton BPegar=new JButton("P");
JButton BGuardar=new JButton("G");
public Menu() {

//ToolBar
TBarra.add(BNuevo);
TBarra.add(BAbrir);
TBarra.add(BGuardar);
TBarra.addSeparator();
TBarra.add(BCopiar);
TBarra.add(BCortar);
TBarra.add(BPegar);
BGuardar.setToolTipText ("Guardar");
BNuevo.setToolTipText ("Nuevo");
BAbrir.setToolTipText ("Abrir");
BCopiar.setToolTipText ("Copiar");
BCortar.setToolTipText ("BCortar");
BPegar.setToolTipText ("Pegar");


add(TBarra,"North");

TBarra.setFloatable(false);
setTitle("Ejemplos JPopUpMenu");
setSize(800,600);
setVisible(true);
}

public static void main (String []args){
new Menu();
}

}