Consultas ¿Necesitas ayuda con tu código?

Si necesitas ayuda con tu código...

Hola amigos, como es muy complicado llegar a tocar todos los temas que os interesan, se me ha ocurrido que, desde mi humilde experiencia, podría ayudaros con los problemas que os encontréis. Si tenéis alguna sugerencia u os gustaría que escribiese sobre un tema en particular en mi próxima entrada, podéis dejar un comentario en esta página. En la medida de mis posibilidades intentaré ir respondiendo vuestras peticiones, bien como una respuesta a vuestros comentarios o si el tema es extenso, publicando una nueva entrada en el blog. Espero que este nuevo servicio sea de vuestro agrado y que os resulte útil. Un saludo Angel Arcos

28 comentarios:

Migue dijo...

Hola Angel, muy interesante tu Blog, aún me cuesta comprender la utilización del TableCellRenderer, será que podrías levantar otro ejemplo de un JTable que tenga una columna que admite icono y la otra una descripción. Gracias.

Unknown dijo...

Hola Marmoleria Cañones, estoy preparando un nuevo ejemplo para intentar ayudarte en tu problema.
En breve estará publicado en el blog.

Un saludo

Eu dijo...

Hola Ángel.
Encontrar tu blog ha sido hoy una agradable sorpresa. El tema del diseño de interfaces es algo que siempre me ha llamado la atención y me ha generado importantes quebraderos de cabeza, casi por igual.
He llegado a tu blog buscano información en la red sobre el modo poner crear celdas dentro de un JTable que permitan la inserción de texto multilínea. El caso es que me permito, dado el manejo que se ve que tienes con swing, el pedirte alguna orientación al respecto por que la verdad es que no encuentro una solución.
Por lo demás ya he añadido a marcadores el blog para leer con detenimiento cada uno de los post. La verdad es que en el vistazo que le he echado no he dejado de ver aplicaciones prácticas a varias de las propuestas.
Muchas gracias y salud2.

Unknown dijo...

Hola Eu,

Para poder insertar texto con varias lineas en una celda bastaría con implementar un CellRenderer en el que el componente devuelto fuese un JTextArea en lugar de un JLabel como en el resto de ejemplos.

Además a este JTextArea habría que establecerle la propiedad setLineWrap(true) para que saltase de linea al llegar al ancho de la celda.

Si tienes alguna duda sobre como hacerlo, puedo subirte un ejemplo funcionando.

Un saludo

Eu dijo...

Buenas Ángel
He implementado el siguiente código y he conseguido meter varias lineas en una sola celda, aunque no he logrado que el tamaño de la celda de ajuste automáticamente al del JTextArea que ahora contiene.
He implementado un sucedaneo accediendo directamente a las propiedades del JTable y modificando su alto con setRowHeight(int).
Así, más o menos, logro el efecto buscado, pero no deja de ser una chapuza.
Salud2

Unknown dijo...

Hola de nuevo Eu.

Para que las celdas se ajusten al tamaño del contenido debes calcular primero ese tamaño que necesitas y establecerlo después. A ver si este código te guía un poco:

// Así obtenemos el ancho de la celda
int cellWidth = table.getCellRect(row, column, false).width;
// Ahora el texto del textarea
String text = table.getValueAt(row, column).toString();

// Vamos a calcular el alto necesario teniendo en cuenta la fuente de la tabla y el tamaño de la cadena de texto:
Graphics g = table.getGraphics();
FontMetrics fm = g.getFontMetrics();
int h = fm.getHeight();
// linesPerRow nos indica cuantas lineas de texto caben en cada "altura predeterminada" de la tabla
double linesPerRow = (double) table.getRowHeight() / h;
// este valor indicará cuantas lineas son necesarias para el texto de esa celda
int linesNeeded = countLines(line, cellWidth, fm);
int neededRows = (int) Math.ceil(linesNeeded / linesPerRow) + 1;
// y solo quedaría establecerle el valor de altura a la fila adecuada de la tabla
table.setRowHeight(row, neededRows * table.getRowHeight());

private int countLines(String line, int width, FontMetrics fm) {

int count = 1;
StringTokenizer wordTokenizer = new StringTokenizer(line);
String tmp = "";
String token = "";

while (wordTokenizer.hasMoreTokens()) {

token = wordTokenizer.nextToken();
tmp += token + " ";

if (fm.stringWidth(tmp) > width) {
tmp = token + " ";
count += (fm.stringWidth(tmp) / width != 0 ? fm.stringWidth(tmp) / width : 1);
}
}

return count;
}

Espero que te ayude a afinar un poco más el resultado.

Eu dijo...

Muchísimas gracias. El código que me das funciona perfectamente. Por algún motivo hay textos que aún rebosan el tamaño de la celda, algún problema mínimo que intentaré encontrar (algo tengo que poner yo !!).
Tu ayuda me ha sido muy provechosa.
Salud2
Como te dije continuaré visitando el resto de los post, así que no dudes que te daré más la lata.

Anónimo dijo...

¿Cómo puedo modificar con Swing el color de los pixeles de una imagen?Tengo una lista de pixeles que forman un camino, y me gustaria poder pintar el camino de un color distinto (mi foto es en escala de grises) y poder mostrarla en mi interfaz.



Un saludo

Unknown dijo...

En contestación al anterior comentario, te recomiendo que eches un ojo a la entrada sobre ma nipulación de imágenes: http://swing-facil.blogspot.com.es/2011/10/manipulacion-y-tratamiento-de-imagenes.html . Si después de leerlo no encuentras nada que te pueda servir intentaremos ayudarte con algo más específico.

Un saludo

Migue dijo...

Buenas tardes Ángel, tendrías algún ejemplo de JButton dentro de celdas de un JTable?
Estoy queriendo implementar de la sgte. manera:
Los botones serían Editar y Eliminar.

ID NOMBRE ACCIONES
================================================
1 Juan Pérez Editar Eliminar
2 Maria González Editar Eliminar
3 Mónica Diaz Editar Eliminar

Gracias.

Unknown dijo...

Buenas Migue aquí tienes un ejemplo de botones dentro de un JTable: http://swing-facil.blogspot.com.es/2012/01/jbutton-jcheckbox-jcombobox-en-jtable.html

Si necesitas algo más, no dudes en pedirlo.

Unknown dijo...

Hola Ángle,
¿Sabes algo de swingset?
He intentado instalarlo siguiendo las instrucciones (añadir swingset.jar a CLASSPATH) pero no me aparece nada. ¿Podrías explicarlo paso a paso?
Gracias

Unknown dijo...

Hola Enrique,
La verdad es que no he usado nunca SwingSet, pero acabo de descargar el .jar y lo he "instalado" en un proyecto sin problema.
http://sourceforge.net/projects/swingset/files/SwingSet/2.0.0/swingset-bin_2.0.0.jar/download

¿Exactamente a que te refieres con que no te aparece nada?
¿Que IDE utilizas?
¿Le has echado un ojo a los ejemplos y demos que vienen dentro del .jar?

AAS dijo...

saludos, vi que en tu blog as sugerido algo referente a los JTable multilinea y quisiera ver si me puedes ayudar...
ya e logrado hacer funcionar dicho código (si mas no me equivoco es este mismo: http://www.esus.com/docs/GetQuestionPage.jsp?uid=1269), pero lo que quiero lograr es agregarle dicha propiedad a una tabla ya echa en javax swing (del modo gráfico)y que tenga esta misma propiedad...

Unknown dijo...

Hola, muchos de tus ejemplos me han servido mucho, ahora tengo un problema en Jtable.

lo que quiero realizar es que al agregar una fila al Jtable, el foco se posicione en ella y el texto de la primera celda se seleccione (para esto la fila se crea con valores predeterminados y el usuario podra modificar el contenido, porque el texto se encuentra seleccionado).
Algo parecido como cuando creas una carpeta nueva en el explorador de windows y te sale el texto "nueva carpeta" sombreado.
Desearía que realizaras un tema sobre esto o que me explicaras con un ejemplo. Gracias

Unknown dijo...

Hola Amigo! tengo una consulta.
cómo se podría llenar un Jtable con un List

por ejemplo List

Unknown dijo...

Hola Unknown, perdona pero no termino de entender tu pregunta, parece que el comentario se ha quedado a medias. ¿Puedes explicarme que es lo que quieres exactamente?

Anónimo dijo...

Hola amigo Angel
Necesito tu ayuda
Tengo que desarrollar un un Jtable con 15 lineas 2 columnas "Nombre y Edad" , luego de ingresados los datos debo de ordenarlos por QUICKSORT despues de esto si edad es impar debe de mostrarse en el JTABLE nuevo o el mismo como sea mas facil es decir solo las edades impares saldran en el nuevo JTABLE ,
Ya tengo la parte de ingresar los valores en un jtable pero se me complica la parte de QIUCKSORT y la parte de leer el VECTOR [] [] y enviarlo al nuevo JTABLE
Me podrias ayudar o dar una idea , en verdad necesito tu ayuda , llevo mas de 15 dias en esto y no lo logro solucionar

gracias y Saludos
Francisco

Unknown dijo...

Hola Francisco,
No entiendo donde tienes el problema exactamente, para el tema del Quicksort puedes encontrar una gran cantidad de ejemplo googleando un poco, por ejemplo: http://puntocomnoesunlenguaje.blogspot.com.es/2012/12/java-quicksort.html
Imagino que el problema lo tienes porque este algoritmo está pensado para un array unidimensional y estás teniendo problemas para traspasar los índices al JTable después de ordenarlos.

En cualquier caso, para ofrecerte más ayuda con esto necesitaría ver tu código y tal vez podría publicarte la solución en una nueva entrada del blog.
Si te parece bien déjame una forma de contactar contigo y lo intentamos solucionar.

Un saludo

Anónimo dijo...

hola a todos, estoy tratando de cambiar el foco de una calda "(0,1)", a otra "(0,4)", cuando presiono enter o tab les agradesco mucho por su atencion y ayuda ...

Necesito ayuda, a cambio ayudo. dijo...

Hola Ángel, soy otro de esos que tienen limitados sus conocimientos y se meten a hacer cosas que no saben. Me he propuesto realizar un editor de texto con formato y voy bastante bien pero en esto de ir poniéndole más funcionalidades me topé con un escalón que no doy pasado: Función: inserto una imagen en el documento en forma de icono y/o dentro del icon de un label (hecho), bien mi problema es que desearía poder escalarlo(manipularlo desde el documento, hacerlo más grande o pequeño) .
* Muchas gracias por el soporte que nos ofreces y soy otro de tus seguidores, un saludo.
CARLOS

Unknown dijo...

Hola Carlos,

Para guiarte un poco te recomiendo que eches un ojo a otros de los post de este blog sobre tratamiento de imágenes: http://swing-facil.blogspot.com.es/2011/10/manipulacion-y-tratamiento-de-imagenes.html y http://swing-facil.blogspot.com.es/2012/03/escalar-imagen-con-swing-zoom-una.html

Además, por guiarte un poco te dejo este método que podría servirte:
public static BufferedImage getScaledImage(BufferedImage image, int width, int height) throws IOException {
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();

double scaleX = (double)width/imageWidth;
double scaleY = (double)height/imageHeight;
AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleY);
AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR);

return bilinearScaleOp.filter(
image,
new BufferedImage(width, height, image.getType()));
}

Combinando ambas cosas y el código que ya tienes hecho en tu editor estoy seguro de que conseguirás lo que buscas ;)

Un saludo

Necesito ayuda, a cambio ayudo. dijo...

Ángel, gracias por tu ayuda.
Puedo escalar una imagen o darle unas dimensiones, pero en mi proyecto deseo que el usuario que usa mi editor pueda manipular el tamaño de una imagen que él haya insertado, no se si me explico.
Supongo que necesito algún contenedor que al pinchar sobre él pueda estirarlo o encogerlo, no se muy bien por donde ir.
Conseguí insertar una imagen en la posición del cursor y eliminarla teniendo el cursor a la izquierda de la imagen dándole a la tecla suprimir, pero no doy como seleccionar la imagen para operar con ella.
De nuevo gracias por tu esfuerzo.
Un saludo, CARLOS.

Unknown dijo...

Hola buenas tarde quisiera que me ayude, como darle formato a unas celdas en un jTable , es decir que ciertas celdas que solo admitan escribir numero y no letras. Le agradeceria mucho la respuesta si es posible con un ejemplo

Unknown dijo...

Hola Arnold, aquí te dejo un ejemplo con una de las posibles maneras de hacerlo, pero hay varias. Con este par de clases darás formato a la tercera columna de la tabla del ejemplo para que admita solo números, espero que te sirva como ejemplo:
http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableFTFEditDemoProject/src/components/TableFTFEditDemo.java
http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableFTFEditDemoProject/src/components/IntegerEditor.java

Unknown dijo...

Hola Ángel espero que estes bien, bueno el problema que tengo es al dibujar una línea con el mouse en un JFrame, cuando voy a trazar la linea ésta parpadea y aveces no se dibuja. Le trate de cambiar algunos metodos pero el que más se acerca es este:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Prueba extends JFrame implements MouseListener,MouseMotionListener {

int posX,posY;

public Prueba(){

setSize(800,600);
getContentPane().setLayout(null);

addMouseListener(this);
addMouseMotionListener(this);

}

public void mouseClicked( MouseEvent e ){}
public void mousePressed( MouseEvent e ){
posX = e.getX();
posY = e.getY();
}
public void mouseEntered( MouseEvent e ){}
public void mouseExited( MouseEvent e ){}
public void mouseReleased( MouseEvent e ){
getGraphics().drawLine( posX,posY,e.getX(),e.getY() );
}

public void mouseDragged( MouseEvent e ){

getGraphics().drawLine( posX,posY,e.getX(),e.getY() );
repaint();

}
public void mouseMoved( MouseEvent e ){}

public static void main( String[] args ){
Prueba p = new Prueba();
p.setVisible(true);
}

}

ya no se que hacer. Te agradesco de antemano tu ayuda

Unknown dijo...

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class panel extends JFrame {
Container container = null;
public panel() {
setSize(350,150);
container = this.getContentPane();
GridLayout grid = new GridLayout(3,2, 5,5);
// filas = 3, columnas = 2, horizontal gap =5,
//vertical gap = 5
container.setLayout(grid);
for (int i=0; i<6; i++)
container.add(new JButton("Button"+(i+1)));

}
}
public class ejemplo20{
public static void main (String[] args){
panel t = new panel();
t.show();
}
} ///:~
podrias explicarmelo linea por linea, por favor!

Doyber Julca dijo...

como validar una celda de un jtable que solo me acepte numeros

Publicar un comentario