Pregunta

He subclaseado ComponentProvider de Swingx para proporcionar JButtons, pero en algunas líneas de mi JXTreetable, no quiero mostrar ningún botón. El "resultado" final que quiero es tener una celda vacía, como lo que obtengo al mostrar un texto vacío en una columna para la que no he establecido un proveedor.

  1. ¿Es posible ocultar el componente renderizado en ciertas filas (dependiendo del valor, por ejemplo)? Ajuste setVisible(false) en el componente renderizado en format() o configureState() no funciona.

  2. ¿Es posible subclase ComponentProvider para proporcionar diferentes tipos de componentes? En caso afirmativo, ¿cómo funcionaría eso?

  3. ¿Dónde puedo encontrar algunos ejemplos de las posibilidades que ofrece ComponentProvider y una explicación clara de qué método hace qué (por ejemplo, apenas entiendo la diferencia entre? configureState() y format())?

EDITAR

  1. ¿Es posible evitar que un jbutton se muestre en una tabla JX (árbol)?

  2. Si creo otro resaltador, ¿puedo usar otro predicado (flujo o algo) para cambiar el cursor? El cursor cambia a una mano (sobre un enlace) incluso si el botón está oculto.

¡Muchas gracias!

¿Fue útil?

Solución

Interesante :-)

  1. Generalmente no funciona porque CellRendererPane no respeta la propiedad visible del componente; siempre la sella. Pero: puede funcionar en Swingx si el proveedor real se envuelve en un controlador de envoltura y luego el componente de ese envoltorio se establece invisible.

un fragmento, al igual que prueba de concepto

table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
        new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {

            @Override
            protected void configureState(CellContext context) {
                super.configureState(context);
                rendererComponent.getComponent().setVisible(context.getRow() != 5);
            }

        }
));

Por otro lado, el proveedor es no El lugar para enchufar la configuración personalizada dependiente del contexto. Que debe hacerse en un marcador, como FI en

AbstractHighlighter highlighter = new AbstractHighlighter(HighlightPredicate.EVEN) {

    @Override
    protected Component doHighlight(Component component,
            ComponentAdapter adapter) {
        ((WrappingIconPanel) component).getComponent().setVisible(false);
        return component;
    }

    @Override
    protected boolean canHighlight(Component component,
            ComponentAdapter adapter) {
        return component instanceof WrappingIconPanel;
    }


};
table.addHighlighter(highlighter);

Que no funciona como se esperaba (el botón siempre está oculto) porque no es una de las propiedades que se garantizan que se restablecerán en el proveedor. Nada evita que los proveedores personalizados extiendan esas garantías, como

table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
        // custom wrappingProvider which guarantees the reset of visible
        // property of the wrapped component
        new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
            @Override
            protected void configureState(CellContext context) {
                super.configureState(context);
                rendererComponent.getComponent().setVisible(true);
            }

        }
));

Ahora el marcador puede cambiar sin miedo lo visible según el contexto. Una pequeña falla visual: el envoltorio de actualización siempre deja algo de espacio para el icono, incluso si no hay ninguno; no estoy seguro de por qué sucede eso o si sería seguro (en Swingx) eliminar ese espacio (el proveedor de envoltura originalmente está destinado a usar en JXTree, no está instalado de forma predeterminada porque todavía hay problemas con la componente).

  1. (2 En la pregunta) No es compatible, el ComponentProvider está diseñado para devolver el mismo componente único configurado con exactamente las mismas propiedades en cada llamada

  2. (3 en la pregunta) tos ... no, nada más que las fuentes y ejemplos (en las demos y los paquetes de prueba)

Editar (Para responder a la parte editada de la pregunta)

  1. No, con el Wrapingiconppanel actual: utiliza un borderLayout que, como todos sabemos :-) no respeta el tamaño máximo. Usar un boxLayout pero tenía problemas que no recuerdo completamente. Sin embargo, ese sería el lugar para ajustar, para que el máximo del botón fuera respetado

  2. Hmmm ... no estoy completamente seguro de cómo implementó el cambio de cursor. Suponiendo que está en su ButtonProvider: implementa el ISRolloverEnableed para devolver verdadero/falso dependiendo de si es visible o no Edición en edición no funciona. No sé por qué, podría ser que este es un error en la decta drogada y/o el manejo en WrepingProvider

Fuera en el fin de semana ahora :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top