Mostrando entradas con la etiqueta JAVA. Mostrar todas las entradas
Mostrando entradas con la etiqueta JAVA. Mostrar todas las entradas

miércoles, 8 de julio de 2015

componente JTextField con PlaceHolder

7/08/2015
JTextField con PlaceHolder

Colegas, hoy les traigo un pequeño aporte, Si alguien ha utilizado HTML o creado formularios en HTML o simplemente ha llenado campos de texto, se han fijado que tieneMARCA DE AGUA denominado PlaceHolder, claro, no todos los autores aplican esta opción a sus campos de texto.


Bueno, partiendo de eso, he visto que eso es una buena opción para los campos de texto, ahora, pues, que bueno seria que los JTextField o campos de texto que proporciona JAVA tuvieran esa opción, pero, realmente no es así.





Como se muestra en la imagen anterior, es lo que proporciona losplaceholder, estos componentes brindan la posibilidad de aparecer cuando los campos estén vacíos y desaparecer cuando el componente adquiere el foco. esto es útil para darle una pista al usuario que dato se requiere en un ese campo. Basta de lalalala.

Hemodificado un JTextFiel que brinde la posibilidad de tener esta opción, es decir, un nuevo componente. ver la siguiente imagen.

A claro, encontré (no recuerdo donde) un componente similar, pero realmente no hacia un buen funcionamiento. tal como debe ser, asi que, este componente es basado de uno que ya existía. pero completamente diferente.

Tiene los siguientes métodos muy útiles:
fontDefault: tipo de letra para el texto que tendrá el campo
fontPlaceHolder: tipo de letra especial para el mensaje de agua
foregroundDefault : color de letra para el texto del campo de texto
foregroundPlaceHolder :color de letra para el texto de marca de agua
textPlaceHolder : método que establecerá el mensaje que desea mostrar (marca de agua o place holder)
isTextWrittenIn: método booleano que regresa True si el campo contiene texto o False si no se ha escrito nada. ya que el mensaje de agua es texto, y si usan el metodo isEmpaty y tiene el mesaje de agua les regresara false. por lo tanto este metodo, les sirve para eso

aqui un ejemplo:



Aqui les dejo el link de descarga del componente y del codigo fuente del programa.
espero les sea útil



Link de descarga del componente

Link de descarga el codigo fuente








martes, 27 de agosto de 2013

Extrae todos los datos de un JTable y guardalos todos en una Tabla MYSQL al mismo tiempo en java

8/27/2013

Mas de una ocasión me han preguntado como extraer todos los datos de un JTable y guardar esos datos en una Tabla MySql ,así que para cumplir con esas dudas hoy les enseño como.

Primero que debemos de hacer?
primero que todo tengo que extraer todos los datos insertados en el JTable y almacenar estos datos en un Array en este caso voy a utilizar unArrayListStringque es ideal y mucho mas fácil manejar.
ante que todo tengo que saber cuantasFilas yColumnas tiene el JTable para esto existen los metodos:getRowCount()método que me retorna el numero de filas existente ygetColumnCount() que me retorna el numero de columnas con estos métodos formare dos buclesfor asi podre recorrer filas y columnas por medio del métodogetValueAt(filas ,columnas) que me recibe el numero de filas y el numero de columnas y que me retornara todos los datos que se han recorrido.


for(int i=0; itabla.getRowCount(); i++) //recorro las filas
{
for(int a=0; atabla.getColumnCount(); a++) //recorro las columnas
{
full_datos.add(modelo.getValueAt(i ,a).toString());
}
}


de esta forma tendré almacenado todos los datos dentro delArrayList.este ArrayList tendremos que pasarle los valores a unIterator para luego recorrer los valores y ser almacenados dentro de un vector estos valores tendrán que ser cortados por un control que que hace referencia al numero de columnas de la tabla en MySql0,1,2 una vez que añadimos los valores al Vector tendré que eliminar esos valores delIterator ,y luego procedemos alamacenar los valores del vector a la Tabla MySqlFila porFila
 Vector datosGuardar=new Vector(1);
int cont=-1;
IteratorString nombreIterator = full_datos.iterator();
while(nombreIterator.hasNext()){
cont++;
String elemento = nombreIterator.next();
if(cont=2){
datosGuardar.addElement(elemento);
nombreIterator.remove();
}

}





Ahora necesito verificar la existencia de datos en la Tabla donde tengo que insertar los datos del JTable
esto lo hago con el fin de saber el numero de registros que existen en la Tabla de la base de datos estos deben ser igual al numero de registros del JTable .

try {
ResultSet rs=ConexionBD.Consulta("SELECT * FROM masi_produc");
if(rs.next()){

int num_filas= ConexionBD.CuantasFilas("masi_produc");

if(num_filas==filas){
hay_datos=false;
}
else{

GuardarDatos(columnas);

}
num_datos.setText(num_filas+" de "+filas+" Datos");


}
else{
GuardarDatos(columnas);
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



como podrá ver formo una consulta simple para determinar si existen datos, si no existen o la tabla esta vacía elResultSet.next() me retornara un valorbooleano falso es ay donde insertamos la primera linea proveniente del método GuardarDatos(columnas); , y si existieran datos elResultSet.next() nos retornara el valorbooleano true aquí es donde utilizamos el métodoCuantasFilas(campo) de la claseConexionBD este método me recibe el nombre de la tabla MySql donde voy a guardar los datos y me retorna el numero de filas que posee esa tabla, y cuando el numero de filas sea igual al numero de filas del JTable este dara paso a una variable booleanaque detendra el HILO que llama a este proceso.


public void run()
{

while(main.hay_datos){

main.VerificarDatos();
}

}



les dejo el codigo fuente completo mas la base de datos .


DESCARGAR




martes, 13 de agosto de 2013

Extraer la imagen de un JLabel y convertirla a Array de bytes y guardarla en una base de datos en java

8/13/2013

Apeticion de un integrante del grupo I.R.P-LEGION, el cual tenia problemas para extraer el icono de un JLabel y convertirla a Array de bytes para luego guardarla en una base de datos ,hoy les enseño como realizar este procedimiento no muy aconsejable ya que la base de datos va a crecer considerablemente.

Primero necesito extraer la imagen o icono del JLabel para esto existe el métodogetIcon() que me retorna el icono o imagen del JLabel,luego necesito transformar este valor de retorno que es unIcon aImage para luego ser convertido en array de bytes por un método llamado
getTransFoto(Image image) este método me recibe el valor de tipo Image que acabamos de transformar para luego proceder a convertirlo a array de bytes por medio de unByteArrayOutputStream(me implementa un flujo de salida en donde se escriben los datos en una matriz de bytes).

private byte [] getTransFoto(Image image) {
ByteArrayOutputStream baos=null;
try {

baos = new ByteArrayOutputStream();
BufferedImage bufferedImage = createBufferedImageFrom(image);
ImageIO.write(bufferedImage, "jpeg", baos);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return baos.toByteArray();
}


luego de ser convertido en array de bytes podemos realizar el proceso para almacenar la cadena de bytes dentro de una tabla cuyo campo debe de ser de tipoBlob .

Pero puedo convertir la cadena de bytes de nuevo a Imagen?
una vez que ya tengamos almacenada la cadena de bytes ,tambien podremos convertir esa cadena a Image, para ello necesito utilizar la claseToolkit y llamar a los metodosgetDefaultToolkit().createImage(bytes) este ultimo me recibe una cadena de bytes y crea unaImage este valor imagen lo retornamos a una variable de tipoImage,para eso creo una metodo que me reciba una sentencia SQL para realizar una consulta simple y extraer esa cadena de bytes que sera convertida aImage este método se llamagetFotografia(String sql,String campo).

public  Image getFotografia(String sql,String campo){ 
Image data=null;
try{
//se lee la cadena de bytes de la base de datos
ResultSet rs;
rs=ConexionBD.Consulta(sql);
while (rs.next()) {
byte[] b = rs.getBytes(campo);
data = ConvertirImagen(b);
}

// esta cadena de bytes sera convertida en una imagen

} catch (IOException ex) {
Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
}catch(SQLException e){
System.out.println(e);
}
return data;
}


Ahora para redimensionar las imágenes al tamaño del JLabel también creo un Método que me recibe el valor de Image y un JLabel, congetScaledInstance() puedo redimensionar la imagen al tamaño del JLabel y retornar el valor a unImageIcon().


public ImageIcon DameFoto(Image image,JLabel label){

ImageIcon imageScalada = new ImageIcon(image.getScaledInstance(guardar_imagen.getWidth(),guardar_imagen.getHeight(),Image.SCALE_DEFAULT));

return imageScalada;
}

les dejo el codigo fuente completo mas la base de datos.


DESCARGAR

lunes, 12 de agosto de 2013

JComboBoxBD Multi Columna carga varios datos en un JComboBox desde Mysql

8/12/2013

Hace poco vimos como cargar datos desdeMysql a un JComboBoxhoy les enseño como añadir mas de un item al JComboBox es bastante útil cuando es necesario mostrar mas de un item ,por defecto el JComboBox no permite esto asta donde yo se , asi que podemos modificarlo para añadir otra columna pero antes de alterar sus estructura lo cual sera un poco mas difícil vamos por otro camino como muy pocos sabrán se pude fusionar HTML y Java ,asi que me baso en unaTabla HTML para lograr lo que necesito, este Componente es uno que hacen fila de la libreria que cree ase tiempo y que nunca puede terminar asi que prefiero compartir pedazos de códigos a que queden en mi disco duro.

Pero como añado una Tabla HTML a un componente de Java?
se puede añadir HTML a varios componente de java y este poder adaptarlo correctamente sin problemas y no es todo puedo darle estilos a la tabla por medio de CSS , asi que sabiendo eso creo un documento simple HTML dentro de una variable STRING.

  str = "html" +
"style type=text/css"+
".estilo1{font-family:"+getFontFirstColumn().getFamily()+"; "+"font-weight:"+fuente(getFontFirstColumn().getStyle())+";"+"font-size:"+getFontFirstColumn().getSize()+"px;"+"color:rgb("+getColorFirstColumn().getRed()+","+getColorFirstColumn().getGreen()+","+getColorFirstColumn().getBlue()+");"+"}"+
".estilo2{font-family:"+getFontSecondColumn().getFamily()+"; "+"font-weight:"+fuente(getFontSecondColumn().getStyle())+";"+"font-size:"+ getFontSecondColumn().getSize()+"px;"+"color:rgb("+getColorSecondColumn().getRed()+","+getColorSecondColumn().getGreen()+","+getColorSecondColumn().getBlue()+");"+"}"+
"/style"+
"table width='"+ancho+"'"+"" +
"tr" +
"td class=estilo1 align='left'" + leftText;
str = str + "/tdtd class=estilo2 align='right'" +
rightText + "/td/tr/table/html";


dentro de esta variable String creo una cadena con las etiquetasHTML y las clases CSS para formar una sola cadena que me recibe valores que serán los items de cada columna y los valores que alteran la tabla para darle un estilo,tipo de fuente,color de fuente todos esos toda esta codificación tendrá que estar dentro de una clase llamadaTableItem esta clase me recibe los valores de cada columna en Array String para luego retorna los items y ser añadidos al JComboBox.

private void addItemColum(String[] left, String right[])
{
if(left.length 1 && right.length1)
{
for(int i=0; ileft.length; i++)
{
this.addItem(new TableItem(this,left[i], right[i]));
}
}

}


por medio del métodoaddItemColum(L,R) que esta en la clasejComboBoxBD puedo añadir items creado dos variables Array String manualmente .

String nombre[]={"Pedro","Pablo","Maria","Eudalia"};
String años[]={"22","20","15","18"};
combo_box_union.addItemColum(nombre, años);


de esta forma podemos añadir items a cada columna,pero manual mente.

Pero si quiero cargar datos desde Mysql?
para ello necesito utilizarArrayListString con el ArrayList podremos almacenar los valores que retorna la consulta SQL cabe recalcar que aquí necesitamos utilizar dos campos de la tabla ya que son dos columnas en el JComboBox , luego que que los ArrayList este cargados le pasamos el valor a dos variables Arrary String ,estas dos varibles seran los valores que recibirá el métodoaddItemColum(String[] left, String right[]) , para luego ser añadidos al JComoBox por medio de addItem();


public void setInjectSQLDobleColumn(String sql,String campo1,String campo2){

try{

ResultSet rs;
rs=ConexionBD.Consulta(sql);
ArrayListString col1 = new ArrayListString();
ArrayListString col2 = new ArrayListString();

while (rs.next()) {
col1.add(rs.getString(campo1));
col2.add(rs.getString(campo2));

}
String [] itemCol_1 = new String [col1.size()];
String [] itemCol_2 = new String [col2.size()];
col1.toArray(itemCol_1);
col2.toArray(itemCol_2);
addItemColum(itemCol_1, itemCol_2);

}
catch(Exception ex){
System.out.println("ERROR EN AL CARGAR DATOS");
}

}


Como retorna los dos valores del Item selecionado ?
para eso necesito recrear dos métodos que reciban y retornen los datos dentro de estos dos metodos estara instanciada la claseTableItem y el valor que recibira los métodos seran de tipo Object .

 public String getLeftText(Object obj)
{
TableItem item = (TableItem)obj;
return item.getLeftText();
}
public String getRightText(Object obj)
{
TableItem item = (TableItem)obj;
return item.getRightText();
}


utilizando los métodos dentro de un eventoactionPerformed.

combo_box_union.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {

txt_nombre.setText(combo_box_union.getLeftText(combo_box_union.getSelectedItem()));
txt_curso.setText(combo_box_union.getRightText(combo_box_union.getSelectedItem()));

}
});


les dejo el codigo fuente completo mas la base de datos.


DESCARGAR

viernes, 9 de agosto de 2013

jComboBoxBD carga datos en un JComboBox desde Mysql con java fácil y rapido

8/09/2013

Hoy les enseño como cargar un JComboBox con datos provenientes de una base de datos MySql ,este ejemplo lo hice con el fin de ayudar a unos integrantes de un grupo en java el cual soy miembro.
Para ello cree una clasejComboBoxBD donde tengo un método muy sencillo pero bastante útil a la hora de cargar datos ,este método recibe dos valores String el primero la sintaxis SQL y el segundo elcampode la tabla en la base de datos que necesito para extraer los datos y añadadirlos al combo.

try{

ResultSet rs;
rs=ConexionBD.Consulta(sql);
while (rs.next()) {
this.addItem(rs.getString(campo));
}
}
catch(Exception ex){
System.out.println("ERROR EN AL CARGAR DATOS");
}


como podrán ver es bastante sencillo tengo mi claseResulSetdeclarada como variable la cual me recibe los valores que retorna la consulta de la claseConexionBD esta clase se encarga de conectarme a la Base de datos y el método Consulta de ejecutar lasentencia SQL luego necesito un siclo while para que el resulset sea recorrido por el método next() desde el primer registro y termina cuando el rs.next() sea null, y con el método getString() el cual me recibe el nombre del campo o el nombre de la columna de la base de datos que necesito extraer los valores este me los retorna para que sean añadidos al JComboBox .

Con este metodo podre realizar consultas ya sea simples o mas complejas como por ejemplo como seria si necesito unir DOS TABLAS y obtener un columna en especifico ?

combo_box_union = new jComboBoxBD();
combo_box_union.setInjectSQL("SELECT datos_varios.profesor AS profe FROM datos_persona INNER JOIN datos_varios ON (datos_persona.codigo = datos_varios.codigo);", "profe");




el métodosetInjectSQL(sql,campo) , se encarga de realizar la consulta y de añadir los items de esta manera podrán utilizar el elemento cuantas veces sea necesario sin tener ningún problema y ahorrar mas codigo. les dejo el codigo fuente completo



DESCARGAR

miércoles, 31 de julio de 2013

Crea ejecutables con base de datos en java con Packjacket mas video tutorial

7/31/2013
PackJacket es una interfaz gráfica para el proyecto IzPack. Está construido con Java Swing y crea un instalador para su aplicación. Los instaladores creados por este programa son multi-plataforma y multi-idioma. Usted puede utilizar PackJacket para crear instaladores para satisfacer sus necesidades.


  • Información general (es decir, nombre, versión, sitio web)
  • Los autores de la aplicación
  • Los paneles de la licencia y la información en forma de texto o html
  • Dimensiones del instalador
  • Idiomas instalador estará disponible en
  • Surtido de paneles comunes
  • De Windows / Unix atajos
  • Cambie Aspecto dependiendo del sistema operativo del usuario
  • Texto de encabezado y las imágenes de instalación
  • Contador de pasos (por ejemplo Paso 3 de 7) en forma de texto o de barra de progreso
  • Logo en la pantalla de selección de idioma
  • Imagen del lado del instalador
  • Instalador puede dividir
  • Packs, más abajo
  • Entrada de usuario para conseguir algo de la entrada del usuario
  • Los procesos en ejecución
  • Multiplataforma GUI - Confirmado para trabajar en Windows Vista y Ubuntu
  • Guardar configuraciones
  • Cree XML, JAR, instaladores EXE
  • Código abierto - licenciado bajo GPL


DESCARGAR



martes, 30 de julio de 2013

JPanelCustom personaliza tus JPanel a tu gusto en java(Parte 1)

7/30/2013

Hace poco vimos comopersonalizar un JButton y convertirlo en una esfera,ahora vamos a personalizar un JPanel a tal punto de poder crear diferentes formas con el este va hacer uno de los varios tutoriales que les presentare para modificar un JPanel sin sobrecargar la aplicación donde vayan a implementar dicho componente.

Efectos que tiene esteJPanelCustom:

  • Imagen de fondo
  • colores en degradado
  • bordes en alto relieve
por ahora veremos como crear esos efectos con el tiempo iremos añadiendo muchos otros .

  • Como Añadir imagen de Fondo
Utilizando la claseGraphics2D implemento o llamo al métododrawImage este método me permite pintar una imagen de fondo dentro del JPanel y al hacer esto no importa el tamaño que tenga el panel la imagen de fondo se re dimensionara automáticamente esto es una de las ventajas de usar este metodo ya que no sera necesario usar un JLabel para añadir imágenes.

g2d.drawImage(image, 0, 0, w,h,this);


este método me recibe los valores de la variable Image donde esta alojada la imagen de fondo,y las coordenadas de donde queremos que se posicione o muestra la imagen y el tamaño de dicha imagen por lo general se utiliza los valores getHeight(); y getWidth(); para saber el tamaño del JPanel si el jpanel cambia de tamaño también lo hará la imagen(se re dimensiona).


  • Como añadir Colores en Degradado
con los ejemplos que eh presentado ya sabemos el uso del degradado.simplemente necesitamos construir una claseGradientPaint y asignarle los valores correspondientes.

bgColor = new GradientPaint(0, 0,getBackgroundTop() ,0, h, getBackgroundBotton());



  • Como añadir Bordes en alto relieve
para añadir este efecto el cual hace vistoso al panel ,vamos a utilizar primeroRectangle2D que sera el encargado de dibujar un rectángulo o darle la forma de rectángulo a nuestro panelRectangle2D es una clase que me recibe 4 sencillos valores las coordenadas X y Y que serán los valores de donde quiero que se posicione el rectángulo que en este caso serán 0 ambas, por que quiero que se posicione el rectángulo desde el inicio del JPanel ,luego los valoresWidth(ancho) yHeight(alto) serán los valores del tamaño real de nuestro JPanel.

Rectangle2D.Float r2d = new Rectangle2D.Float(0, 0, w - 1, h - 1); Shape clip = g2d.getClip(); g2d.clip(r2d); g2d.setPaint(color); g2d.fillRect(0, 0, w, h); g2d.setClip(clip); g2d.setColor(new Color(100, 100, 100));//primer relieve g2d.drawRect(0, 0, w - 1, h - 1); g2d.setColor(new Color(255, 255, 255, 50));//segundo relieve g2d.drawRect(1, 1, w - 3, h - 3);


luego necesito añadir un fillRect este método me permite dibujar un rectángulo con la capacidad de añadir el degradado o el fondo lo que se esta haciendo aquí en añadir un rectángulo encima de otro,luego para dar el efecto de relieve necesito añadir el métododrawRect que me dibuja el contorno del rectángulo dando asi el efecto de alto relieve.

les dejo el código fuente completo .


DESCARGAR






JButtonBall añade y aprende como hacer un JButton tipo esfera en java

7/30/2013

Hace poco vimos como crear unJButton translucido o transparente, aquí vamos a utilizar una lógica similar primero necesito quitar los efectos por defecto que tiene el JButton ya sabemos que utilizando los métodos .
  • setFocusable(false);
  • setContentAreaFilled(false);
  • setBorderPainted(false);
nos permite quitar esos valores, entonces vamos utilizar la claseGraphics2D nuevamente y hago uso defillOval este método me permite dibujar un circulo donde añado o dibujo un gradiente con la claseGradientPaint que sera el fondo del JButton y otro circulo que estará situado en la parte superior este circulo sera el efecto de reflejo de la esfera también pintado con unGradientPaint,ahora lo nuevo aquí es el efecto de luz inferior de la esfera es una clase llamadaRadialGradientPaint la cual puede formar un gradiente pero de tipo radial es decir de tipo esférico sin la necesitada de recurrir alfillOval.

RadialGradientPaint p = new RadialGradientPaint(new Point2D.Double( getWidth() / 2.0, getHeight() * 1.5), getWidth() / 2.3f, new Point2D.Double(getWidth() / 2.0, getHeight() * 1.75 + 6), new float[] { 0.0f, 0.8f }, new Color[] { destelloinicial,destellofinal}, RadialGradientPaint.CycleMethod.NO_CYCLE, RadialGradientPaint.ColorSpaceType.SRGB, AffineTransform.getScaleInstance(1.0, 0.5));


esteRadialGradientPaint me recibe dos valores que la clasePoint2D.Double me proporciona estos valores serán la forma y la posición que yo necesito para situar el Radial ,luego me permite añadir valoresflotantes que seran valores de transparencia del Radial seguido de dos valores de tipoColorpara formar el gradiente.

Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); int h = getHeight(); int height = getHeight(); ButtonModel modelo = getModel(); GradientPaint reflejo_superior = null; GradientPaint fondo_boton = null; /********************************/ reflejo_superior = new GradientPaint(0, 0, new Color(255, 255, 255),0, height / 2, new Color(120, 137, 145, 20)); /********************************/ fondo_boton = new GradientPaint(0, h / 2, getBackgroundTop(), 0, h, getBackgroundBotton()); setForeground(Color.WHITE); if(modelo.isPressed()) { /**SI EL BUTON FUE PRESIONADO*/ fondo_boton = new GradientPaint(0, h / 2, getBackgroundTop(), 0, h, getBackgroundBotton()); }else if(modelo.isRollover()) { /*****SI PASA POR ENCIMA*****/ fondo_boton = new GradientPaint(0, h / 2, getBackgroundTopHover(), 0, h, getBackgroundBottonHover()); } /*************************/ g2d.setPaint(fondo_boton); g2d.fillOval(0, 0, getWidth(), getHeight()); /**********REFLEJO SUPERIOR*************/ g2d.setPaint(reflejo_superior); g2d.fillOval(getWidth() / 3, 6, getWidth() / 3, getHeight() / 6); /*********DESTELLO*****************/ RadialGradientPaint p = new RadialGradientPaint(new Point2D.Double(getWidth() / 2.0, getHeight() * 1.5), getWidth() / 2.3f, new Point2D.Double(getWidth() / 2.0, getHeight() * 1.75 + 6), new float[] { 0.0f, 0.8f }, new Color[] { destelloinicial,destellofinal}, RadialGradientPaint.CycleMethod.NO_CYCLE, RadialGradientPaint.ColorSpaceType.SRGB, AffineTransform.getScaleInstance(1.0, 0.5)); g2d.setPaint(p); g2d.fillOval(0, 0, getWidth() - 1, getHeight() - 1);


les dejo el código fuente completo con métodos para cambiar el color de las esferas.


DESCARGAR


lunes, 29 de julio de 2013

JButtonTrans añade a tus proyectos java un JButton transparente en java

7/29/2013

Ya tenia mucho tiempo que no posteaba nada referente a java, hoy les traigo un JButton modificado totalmente translucido y no muy difícil de lograr.
para modificar o personalizar cualquier Objeto que nos ofrece java necesito la utilizar la claseGraphics2D , lo que eh hecho para modificar el JButton es primero eliminar el fondo y el borde por defecto deshabilitar el focus o rollover(efecto que se muestra al pasar el mouse) llamando a los siguientes métodos.
  • setContentAreaFilled(false);
  • setFocusPainted(false);
  • setBorderPainted(false);
  • setOpaque(false);

con estos métodos tendré un JButton transparente en su totalidad pero aun no tiene el efecto que necesito asi que utilizo la interfazShape que me permite dibujar una forma en este caso quiero que se dibuje un rectángulo con bordes redondeados para ello necesito construir y llamar a la claseRoundRectangle2D esta clase me recibe 6 valores los dos primero las coordenadas X y Y luego el ancho(Width) y alto(Height) que tendra el boton y por ultimo dos valores que serán el radio o los valores para redondear las esquinas.

Shape area = new RoundRectangle2D.Float(x, y, w-1, h-1, getRadioButton(), getRadioButton());

de esta forma tendré dibujado en mi botón un rectángulo con bordes redondeados, ahora para pintar el JButton necesito definir o declaras 4 variables Color donde cada una tendrá valores flotantes del 0 al 1 estos valores serán los colores translucidos donde tendré que combinarlos para formar un gradiente, para eso necesito pintar al JButton con el métodosetPaint() un gradiente es decir tendré que construir o llamar ala claseGradientPaint esta clase me permita pintar o dibujar un gradiente recibiendo las coordenadas X y Y del botón mas los colores.

protected void paintComponent(Graphics g) { int x = 0; int y = 0; int w = getWidth(); int h = getHeight(); Graphics2D g2 = (Graphics2D)g.create(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Shape area = new RoundRectangle2D.Float(x, y, w-1, h-1, getRadioButton(), getRadioButton()); color_1 = color_trans_1; color_2 = color_trans_2; ButtonModel m = getModel(); if(m.isPressed()) { /**SI EL BUTON FUE PRESIONADO*/ color_1 = color_trans_4; color_2 = color_trans_3; }else if(m.isRollover()) { /*****SI PASA POR ENCIMA*****/ color_1 = color_trans_3; color_2 = color_trans_4; } /*****creo un gradiente*******/ g2.setPaint(new GradientPaint(x, y, color_1, x, y+h, color_2, true)); g2.fill(area); g2.setPaint(color_trans_2); g2.draw(area); g2.dispose(); super.paintComponent(g); }

Tambien para dar un efecto mas notable hago uso de un Modelo del JButton,llamo a la claseButtonModel para detectar cuando el boton fue presionado o el cursor esta encima de boton de esta forma puedo cambiar los colores y dar otro efecto.

les dejo el codigo fuente completo.


DESCARGAR


jueves, 30 de mayo de 2013

Explora y lee Archivos de tu Pc con java (Forma 1)

5/30/2013

A petición de un usuario hoy les presento como realizar un explorador de archivos y leer el archivo seleccionado,pero primero.

Que es un JTree?
un JTree es un árbol que muestra un conjunto de datos en jerarquía, el cual podemos abrir cada nodo o directorio y subdirectorios que posea el directorio origen en este caso un explorador de archivos del directorio desktop o escritorio de la Pc.

para mi un arbol o JTree es uno de los elementos de swing mas complejos seguido del JTable que tiene java. el código que comparto con ustedes lo saque de una aplicación(Decompile) para que lo puedan mejorar si son curiosos dentro del proyecto de descarga encontraran una clase cuyo nombre esFileTreeListener es el escucha de la claseFileTreePanel ademas de ser el oyente o evento me permite añadir un JPopupMenu con el fin de añadir o eliminar elementos al hacer click derecho con el mouse.

Pero como añado o en listo los archivos de un determinado directorio?
para en listar un directorios tengo al metodolistRoots()de la clase File que me permite en listar todos los directorios del computador.
DefaultTreeModel es la clase que nos contendrá todos los datos en este caso los archivos que veremos en el JTree(La vista)
DefaultMutableTreeNode me permite identificar los padres(Directorios) y saber si cada padre tiene hijos(Ficheros) esto lo usa el JTree para saber que pintar y diferenciar quien es hijo(Fichero) de cada padre(Directorios), ademas esta Clase permite modificar las asociaciones entre padres y hijos lo quepermitiríaañadir nuevos hijos a los padres o añadir mas padres.

File[] roots = null;
if (Constants.isWindows)
roots = fsv.getRoots();
else
roots = File.listRoots();

if (roots.length == 1)
{
rootNode = new DefaultMutableTreeNode(new FileTreeNode(roots[0]));
populateSubTree(rootNode);
}
else if (roots.length 1)
{
rootNode = new DefaultMutableTreeNode("Computer");
for (File root:roots)
rootNode.add(new DefaultMutableTreeNode(root));
}
else
rootNode = new DefaultMutableTreeNode("Error");

fileTreeModel.setRoot(rootNode);


este pequeño fragmento de código es el inicializador ,primero determina que tipo de sistema operativo tiene el usuario luego en lista los directorios y comienza añadir los padres y los hijos.

Como leer un Archivosegúnsea la extension al seleccionar un hijo(Fichero) del JTree?
dentro de la claseFileTreePanel existe un método llamandoAbreArchivo(valor1,valor2) este método me recibe dos valores la clase padre que posee el main(principal) y la ruta del archivo seleccionado esta ruta la recibe la claseFileReader que luego pasara a ser leida por unBufferedReader que me obtendrá el contenido del archivo seleccionado.


if (abrir != null) {
System.out.println("ENTRO ABRIR");

if (abrir.getAbsolutePath().endsWith(".txt")||abrir.getAbsolutePath().endsWith(".java")) {

System.out.println("ENTRO EN LEER");
/***********************************/
FileReader archivo = new FileReader(abrir);
BufferedReader leer = new BufferedReader(archivo);
while ((s = leer.readLine()) != null) {
cad += s + "\n";

}
main.getTextArea().setText(cad);

leer.close();

}
else {

JOptionPane.showMessageDialog(null, "Solo se permiten archivos con extension *.txt,*.java ");
}

}


DESCARGAR CODIGO FUENTE

lunes, 27 de mayo de 2013

Aprende como Crear un circulo de amigos Google+ en java (Parte 1)

5/27/2013

Hace algún tiempojc-Mouse admin y programador de jc-mouse(blog)y jc-mouse(net), me pregunto un día si podría realzar un ejemplo sobre los círculos de amigos que tiene google+(por cierto google+ se actualizo y para mi gusto esta mejor que facebook :)). y hoy es ese día y recordé que existe una forma con un layout especial para colocar cualquier elemento de forma circular y el resto seria trabajo deGraphics2D mi objetivo era de comunicarme con google a través de su API para obtener las imágenes de los seguidores en google+ pero no tuve existo ,por ahora comparto con ustedes la primera parte de la aplicación por que falta aun mas.

Pero existe un layout que me permite colocar los elementos de forma circular?
siCircleLayout permite añadir cualquier varios elemento y dar las coordenadas para ubicar los de forma circular solo tendríamos que instanciar la claseCircleLayout , setLayout(newCircleLayout).
la claseCircleLayout ya viene incluida en el proyecto de descarga para cualquir uso que le quieran dar yo ya tengo unas ideas de como darle uso.

Como darle forma circular al panel y a las imagenes?
ya teniendo el layout que era la parte mas difícil el resto solo tendríamos que hacer uso de la claseGraphics2D .

Darle forma al JPanel

int w = getWidth(); 
int h = getHeight();
Graphics2D g2d = (Graphics2D)g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
/********************************/
//TextLayout me permite pintar o añadir texto a cualquir elemento en este caso un JPanel
TextLayout texto = new TextLayout("Soy Seguidor(a)",new Font("Dialog", Font.PLAIN, 21), g2d.getFontRenderContext());
TextLayout total = new TextLayout("10",new Font("Dialog", Font.BOLD, 30), g2d.getFontRenderContext());
/*********AÑADO LA FORMA CIRCULAR AL JPANEL**********************/
g2d.setPaint(new Color(21,160,203));//AÑADO COLOR DE FONDO
g2d.fill(new Ellipse2D.Double(3, 3, w-6, h-6));//LE DOY LA FORMA AL JPANEL
g2d.setColor(new Color(100, 100, 100));
g2d.drawOval(3, 3, getWidth()-7, getHeight()-7);
g2d.setColor(new Color(255, 255, 255, 50));
g2d.drawOval(3, 3, getWidth()-6, getHeight()-6);
/*********AÑADO EL TEXTO Y LE DOY COLOR***************/
g2d.setColor(Color.WHITE);
texto.draw(g2d,w/3,h/2); //TEXTO CENTRADO SEGUN EL TAMAÑO DEL TEXTO
g2d.setColor(new Color(204, 204, 204));
total.draw(g2d,w/2-10,h/2+32);
/**********/
g2d.dispose();


Darle forma a lasimágenes
las imágenes de los seguidores serian botones que estarían agregados al JPanel con el layoutCircleLayout , hago lo mismo que hice en el JPanel pero, para redondear las imágenes tendría que utilizar la claseEllipse2D.Float(x, y, w,h); esta clase me permite realzar la forma circular seguido de la clasedrawImage() que me permite pintar la imagen dentro del JButton.

if(getImage()!=null){
g2.setClip(getForma());//LE DOY FORMA A LA IMAGEN CON LA CLASE ELLIPSE
g2.drawImage(image,3,3, w-6,h-6,this);//PINTO LA IMAGEN EN EL BOTON
}

protected Shape getForma(){

int w=this.getWidth();
int h=this.getHeight();

return new Ellipse2D.Float(3, 3, w-6,h-6);
}

y de esa forma obtendré las formas deseas que se asemejen al circulo de amigos de Google+.

DESCARGARTE EL CODIGO FUENTE



martes, 23 de abril de 2013

Aprende como realizar un Ping Grafico desde java

4/23/2013

Hoy comparto con ustedes otro fragmento de unaaplicaciónque desarrolle como tema de tesis ya hemos visto como analizar el disco desde java ,ahora veremos como realizar un ping con el fin de comprobar si existeconexión de RED.

PanelGráficoo monitor de red
Si han utilizado lalibreríaJFreeChart sabes de su potencial que tiene para crear representacionesestadísticas,estalibreríala vamos utilizar(ya viene incluida en el proyecto de descarga) ,la claseChartPanel es aquella que voy a utilizar para crear misgráficosque me representen la existencia de que hay flujo de red o que el usuario esta conectado a internet.

     
TimeSeriesCollection localTimeSeriesCollection = new TimeSeriesCollection();
localTimeSeriesCollection.addSeries(total);
/*********************************************/
DateAxis localDateAxis = new DateAxis("TIEMPO DE RESPUESTA");
NumberAxis localNumberAxis = new NumberAxis("CAPACIDAD");
localDateAxis.setTickLabelFont(new Font("SansSerif", 0, 12));
localNumberAxis.setTickLabelFont(new Font("SansSerif", 0, 12));
localDateAxis.setLabelFont(new Font("SansSerif", 0, 14));
localNumberAxis.setLabelFont(new Font("SansSerif", 0, 14));
XYLineAndShapeRenderer localXYLineAndShapeRenderer = new XYLineAndShapeRenderer(true, false);
localXYLineAndShapeRenderer.setSeriesPaint(0, Color.red);
localXYLineAndShapeRenderer.setSeriesPaint(1, Color.green);
localXYLineAndShapeRenderer.setSeriesStroke(0, new BasicStroke(3.0F, 0, 2));
localXYLineAndShapeRenderer.setSeriesStroke(1, new BasicStroke(3.0F, 0, 2));
XYPlot localXYPlot = new XYPlot(localTimeSeriesCollection, localDateAxis, localNumberAxis, localXYLineAndShapeRenderer);
localDateAxis.setAutoRange(true);
localDateAxis.setLowerMargin(0.0D);
localDateAxis.setUpperMargin(0.0D);
localDateAxis.setTickLabelsVisible(true);
localNumberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
JFreeChart localJFreeChart = new JFreeChart("FLUJO DE CONEXION DE RED", new Font("SansSerif", 1, 24), localXYPlot, true);
ChartUtilities.applyCurrentTheme(localJFreeChart);
ChartPanel localChartPanel = new ChartPanel(localJFreeChart, true);
localChartPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4), BorderFactory.createLineBorder(Color.black)));


Para entender un poco mas el manejo del api JFreeChart les sugiero que visiten suwebsite y se empapen deinformación.

Pero si losgráficosestadísticosde JFreeChart sonestáticoscomo los puedo ANIMAR??
exite una forma de como generar coordenadas aleatorias y esto es con la ayuda deMath.random() y unThreadde esta forma doy coordenadas aleatorias y dando el efecto deanimación pero solo si existeconexión se mostrara los graficos .

  
try {
Thread.sleep(100);
double value = Math.random()*100;
monitor_flujo_red.addTotalObservation(value);
}
catch (InterruptedException e)
{
System.out.println("Error"+e);
}


Ahora como realizamos el PING?
si alguna vez utilizaron la consola de comando del MS-DOS para realizar un ping sabran que el comando o la sintaxis a utilizar es:
ping www.google.com -t

el comando ping se utiliza para saber cuando una pc esta conectada a internet o a otra red,enviando una cantidad de paquetes llamados ICMP.

Pero para ejecutar este comando en java necesitaremos la claseRuntime ,esta clase nos permite ejecutar cualquier comando y junto ala ClaseProcessobtendréel proceso que sera enviado a unInputStreamReader paradespuésser recibido por unBufferedReader


                String pingCMD = COMANDO + ESPACIO + ip+" "+"-t"; 
try{
Runtime ejecuta = Runtime.getRuntime();
Process proceso = ejecuta.exec( pingCMD );
entrada = new InputStreamReader( proceso.getInputStream() );
buffer = new BufferedReader( entrada );
bufferror = new BufferedReader(new InputStreamReader(proceso.getErrorStream()));
}
catch( IOException e ){
System.out.println( e );
}
catch( Exception e ){
System.out.println( e );
}
después de este proceso elBufferedReader quedara cargado y seobtendrálas lineas del proceso o el paquete de datos que envia el ping,para obtener estas lineas necesito unThread (Hilo) des esta forma sabre cuando hay una respuesta y cuando no(si hay o no conexion).

public void run(){
try {
String x=buffer.readLine();
while(x!=null){
x=buffer.readLine();
if(x==null){
hay_señal=false;
}
else
{
hay_señal=true;
}
if(hay_señal==true)
{
moni();
hay_red(padre);
}
else
{
hay_red(padre);
intentos++;
System.out.println("ENTRO CERO CONEXION REINTEENTANDO...."+" "+intentos);
comando_ping pin=new comando_ping(padre,"www.google.com");
pin.start();
}
}

String a=bufferror.readLine();
while(a!=null){
a=bufferror.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
if(intentos==10)
{
pausa();
}

}






Contraseña solo post del 2012: javafaceContraseña Actual: www.javaface-elblogdelprogramador.com

jueves, 21 de marzo de 2013

Notificaciones al estilo Avira Antivirus desarrollado en java

3/21/2013


Eldíade ayer me pidieron un ejemplo de notificaciones y justopensépor que no hacerlo como muestra las notificaciones Avira las cuales son pantallas emergentes que suben desde la barra de herramienta. para esto tenemos queconstruirun JDialog que es ideal para este efecto ya que es un ventana modal al ser modal no me ancla el icono de la ventana en la barra de tareas.

Construcción
para este efecto primero debemos obtener los valores de laresoluciónde la pantalla es decir su ancho y alto esto lo hacemos con la claseGraphicsEnvironment esta clase me permite tener los recursos de pantallas locales o impresoras y junto almétodogetLocalGraphicsEnvironment()que me retorna los valoresgráficosde un equipo local.

private  Rectangle inicializarRectangulo() {
GraphicsEnvironment entorno = GraphicsEnvironment.getLocalGraphicsEnvironment();
escritorio = entorno.getMaximumWindowBounds();
return escritorio;
}


este método nos va a retornar los valores máximos de la pantalla,ahora necesitaremos crear dosmétodosmas paraobtenerel ancho y el alto de la pantalla

      
/**********ANCHO***********/
public int getAncho()
{
bordes=inicializarRectangulo();
return bordes.width;
}
/**********ALTO**************/
public int getAlto()
{
bordes=inicializarRectangulo();
return bordes.height;
}


ahora existen algunas formas de obtener la resolución de la pantalla como por ejemplo usando la clase Toolkit.getDefaultToolkit().getScreenSize().

Efecto de desplazamiento(Subir y Bajar)
para el efecto necesitaremosconstruiruna claseThread la cual merecibirádos valores la clase notificador que es elJDialog y un valorbooleano que sera que determina cuando subir y cuando bajar,esta clase notificador me enviara los valores ancho y alto de la pantalla y realizando unaoperaciónsimple(una resta) con las dimensiones(Tamaño) del JDialog elúnicovalor que me interesa es el alto(getHeight()) del JDialog el cual se restara con elmétodogetAlto() que contiene el valor del alto de la pantalla de esta forma podre incrementar y decrementar los valores haciendo que el JDialog suba y baje utilizando elmétodopara posicionar el JDialog que essetLocation(ancho, alto);

public void run(){
while(arrancar){
if(sube_baja==true)
{
cont++;
if(cont=flota.getHeight()){
valor_actual=flota.getAlto()-cont;
flota.setLocation(flota.getAncho()-flota.getWidth(),valor_actual);
flota.setVisible(true);
}
else
{
arrancar=false;
cont=0;
}
}
else
{
cont++;
valor_final=(flota.getHeight()+flota.getHeight()/2)+cont;
if(valor_final=flota.getAlto()){
flota.setLocation(flota.getAncho()-flota.getWidth(), valor_final);
flota.setVisible(true);
}
else
{
arrancar=false;
cont=0;
flota.dispose();
}

}

flota.repaint();
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
/*fin while*/
}


En la proxima les enseñare el mismo efecto pero mas elaborado.
DESCARGAR