De vuelta a "Revelaciones" y tras varias vueltas, finalmente descarto el uso de uploadify y me quedo con plupload. Esta librería es más versátil en su utilización, es más fácil de integrar y ofrece soluciones alternativas, y opacas para el programador, según los distintos sistemas y navegadores, usando flash, html4, html5 o silverlight según sea necesario.
Respecto a la integración, puedo evitar el uso de un botón que esté siempre visible durante la subida, lo cual me permite hacer la web más fluida. Cuando uploadify, y cualquier elemento basado en flash, se oculta, por ejemplo haciendo un JQuery.hide(), el motor de adobe oculta y deshabilita el objeto, paralizando cualquier proceso que esté ejecutando en ese momento. Y si no queremos ocultar el objeto por estas razones, es prácticamente imposible engañar al sistema cambiando el tamaño del botón flash.
Quizás sea piquismiquis, pero es horroroso tener un control incontrolable. plupload entra en Revelaciones y sale uploadify.
jueves, 6 de marzo de 2014
sábado, 1 de marzo de 2014
Adaptando el JList
Para el Yoching me he encontrado con la necesidad de adaptar el sistema de selección de un
Lo que necesitaba era que la lista simulara el comportamiento de una sucesión de checkboxes, es decir, que si pulso sobre un elemento de la lista, este elemento permuta su estado de selección, manteniendo la selección del resto de la lista inalterada.
Hay varias soluciones para esto, cada cual que elija la suya. Se puede colocar una serie de
Partiendo del código fuente de
Vamos al código
El primer método en cuestión es
En
Y que no se nos olvide mantener el modo de selección fijo:
¡Ya sólo falta decirle al
JList
. El comportamiento estándar de una lista es que si se clickea sobre un elemento, éste pasa a estar seleccionado, borrando la selección anterior a no ser que se mantengan pulsadas las teclas shift, control o command, haciendo entonces selecciones múltiples, continúas o discontinúas.Lo que necesitaba era que la lista simulara el comportamiento de una sucesión de checkboxes, es decir, que si pulso sobre un elemento de la lista, este elemento permuta su estado de selección, manteniendo la selección del resto de la lista inalterada.
Hay varias soluciones para esto, cada cual que elija la suya. Se puede colocar una serie de
JCheckBox
en un JPanel
con layout vertical. Se puede hacer un ListCellRenderer
que herede de un JCheckBox
e implementar un controlador de activaciones. En cambio, he atacado el problema manipulando el modelo de selección del JList
: he creado mi propio ListSelectionModel
adaptado la clase DefaultListSelectionModel
.Partiendo del código fuente de
DefaultListSelectionModel
, encuentro que hay varios métodos que necesito retocar para tener el modo de selección buscado. Por desgracia, para reescribirlos no puedo heredar mi clase de DefaultListSelectionModel
, pues en sus tripas se hacen referencia a métodos y campos privados, y lo más fácil es reescribir la clase fuente.Vamos al código
El primer método en cuestión es
setSelectionInterval
. Como su nombre indica, establece el intervalo de selección, reseteando el estado anterior. Lo que hay que hacer es que llame directamente a addSelectionInterval
, es decir, que añada el nuevo intervalo a la selección existente:public void setSelectionInterval(int index0, int index1) {
addSelectionInterval(index0, index1);
}
En
addSelectionInterval
obviamos las opciones que no nos interesa, pues nuestro modo de edición es MULTIPLE_INTERVAL_SELECTION
, y así llegamos al método privado changeSelection
. Simplificamos mucho la función original, eliminando el parámetro booleano clearFirst
e intercambiando el estado de los items de la nueva selección:private void changeSelection(int clearMin, int clearMax, int setMin, int setMax) {
for (int i = Math.min(setMin, clearMin); i <= Math.max(setMax, clearMax); i++) {
flip(i);
}
fireValueChanged();
}
private void flip(int r) {
if (value.get(r))
clear(r);
else
set(r);
}
Y que no se nos olvide mantener el modo de selección fijo:
public void setSelectionMode(int selectionMode) {
this.selectionMode = MULTIPLE_INTERVAL_SELECTION;
}
¡Ya sólo falta decirle al
JList
que queremos tener este modelo de selección!JList list = new JList();
list.setSelectionModel(new AccumulativeSelectionModel());
La pelea incansable
Tras un día liado porque a veces funciona uploadify y otras no, he llegado a la siguiente conclusión: dejaba de funcionar porque ocultaba uploadify al empezar la subida. Así que lo he cambiado para que se oculte cuando acabe, es decir, cuando en el evento
onUploadComplete
o en onUploadError
la cola tenga un tamaño 0
.
Suscribirse a:
Entradas (Atom)