Estoy usando una JList para contener datos de chat para mi programa de chat.
Utiliza un renderizador de lista personalizado para representar un objeto JPanel personalizado como el tipo de elemento.
Este JPanel contiene dos JLabels (ancladas en la parte superior, para el nombre y la hora), y un JTextArea (anclado en la parte inferior, para el mensaje de chat).Revalidando JList - elementos personalizados
Parece que este:
a pic1 http://oi44.tinypic.com/20jiix5.jpg
Todo funciona muy bien, pero quiero añadir una característica ocultar/mostrar.
Usando un controlador PopupMenu previamente programado, aparece una ventana emergente cuando haces clic con el botón derecho en un elemento.
a pic2 http://oi42.tinypic.com/2m5exxt.jpg
Al hacer clic en Ocultar (o show, es un conmutador), entonces se debe reducir al mínimo el elemento como tal ...
a pic3 http://oi41.tinypic.com/kf3apx.jpg
El único problema es ... que doesn Actualice el tamaño de la celda JList ya que puede ver la gran región vacía donde solía estar el texto.
Sin embargo, cuando escribo otro mensaje ...
a pic4 http://oi40.tinypic.com/35jdoo7.jpg
El JList fija el tamaño de la celda de completar la operación 'ocultar'.
Mi pregunta es cómo obtener la JList para revalidar/repintar/etc. programáticamente.
Y no creas que no he probado todas las soluciones obvias ...
public void setHidden(boolean hidden) {
// this is in the custom JPanel class
System.out.println("Initial: " + this.getPreferredSize());
// TextArea is the JTextArea which we set invisible when we want to hide it.
TextArea.setVisible(!hidden); // TextArea is a variable btw
this.invalidate();
this.validate();
this.repaint();
System.out.println("After: " + this.getPreferredSize());
container.revalidate();
}
/*
* This is what the above printlns show when you hide, then show the element.
*
* Initial: java.awt.Dimension[width=176,height=38]
* After: java.awt.Dimension[width=176,height=20]
* Initial: java.awt.Dimension[width=176,height=20]
* After: java.awt.Dimension[width=176,height=38]
*/
public void revalidate() {
// container.revalidate() ^^^
// list is the list containing the chat elements
list.invalidate();
list.validate();
list.repaint();
}
La clase JPanel personalizada utiliza un GroupLayout para hacer que los componentes.
¿Tienen algún conocimiento sobre cómo hacer que una JList revalide programáticamente el tamaño de sus celdas?
... además de los métodos que he publicado? :)
Solución:
Después de buscar método después de método y probar si se solucionarían mi problema, he encontrado que la ejecución de este código después de una operación de ocultar/mostrar haría que la altura de la celda (y anchura) y volver a calcular sin ningún 'parpadeo' visual no deseado de la JList.
list.setFixedCellHeight(0);
list.setFixedCellWidth(0);
list.setFixedCellHeight(-1);
list.setFixedCellWidth(-1);
por favor, aprenda las convenciones de nomenclatura de Java y adhiérase a ellas – kleopatra
Conozco la convención de nomenclatura de Java, solo me gusta tener mis variables de swing en mayúsculas. Pero tampoco siempre sigo eso ... –