Domanda

Ho una sottoclasse ComponentProvider di Swingx di fornire JButtons ma su alcune linee della mia JXTreeTable, non voglio mostrare un tasto qualsiasi. Il "risultato" finale che voglio è quello di avere una cella vuota, come quello che ottengo quando mostra un testo vuoto in una colonna per la quale non ho impostato un provider.

  1. E 'possibile nascondere il componente reso su alcune righe (a seconda del valore, per esempio)? Impostazione setVisible(false) sulla componente reso in format() o configureState() non funziona.

  2. E 'possibile creare una sottoclasse ComponentProvider per fornire diversi diversi tipi di componenti? Se sì, come vorrei che il lavoro?

  3. Dove posso trovare alcuni esempi delle possibilità che le ComponentProvider offerte e una spiegazione chiara di quale metodo fa quello (per esempio, faccio fatica a capire la differenza tra configureState() e format())?

Modifica

  1. E 'possibile evitare che un JButton visualizzato in una JX (Albero)? Tabella di essere largo quanto il cellulare?

  2. Se creo un'altra evidenziatore, posso usare un altro predicato (rollover o qualcosa) per cambiare il cursore? Il cambiamento cursore in una mano (su un collegamento), anche se il pulsante è nascosto.

Molte grazie!

È stato utile?

Soluzione

Interessante: -)

  1. generalmente non funziona perché il CellRendererPane non rispetta proprietà visibile del componente - IT francobolli sempre. MA: può lavorare in SwingX se il provider attuale è avvolto in un WrappingProvider e quindi tale componente di involucro è impostato invisibile.

un frammento, come proof-of-concept

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);
            }

        }
));

D'altra parte, il provider è non il posto per collegare in configurazione dipendente dal contesto personalizzato. Che dovrebbe essere fatto in un evidenziatore, come F.I. in

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);

che non funziona come previsto (il tasto è sempre nascosto), perché non è una delle proprietà che sono garantiti per essere ripristinato nel provider. fornitori impedisce Niente personalizzate per estendere tali garanzie, come

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);
            }

        }
));

Ora l'evidenziatore può cambiare senza paura il visibile in base al contesto. Un leggero difetto visivo: il WrappingIconPanel lascia sempre un pò di spazio per l'icona, anche se non c'è nessuno - non del tutto sicuro perché ciò che accade o se sarebbe stato sicuro (in SwingX) per rimuovere che la spaziatura (il wrappingProvider originariamente è destinato per l'uso in JXTree, non è installato di default, perché ci sono ancora problemi con ComponentOrientation).

  1. (2 nell'interrogazione) non supportato, il componentProvider è progettato per restituire la stessa componente singolo configurato con le stesse proprietà su ogni chiamata

  2. (3 in questione) tosse ... no, niente ma le fonti e gli esempi (nei demo e pacchetti di prova)

Modifica (per rispondere alla parte editata della questione)

  1. no, con il WrappingIconpPanel corrente: lo fa usare un BorderLayout, che - come tutti sappiamo :-) non rispetta la dimensione massima. Utilizzando un BoxLayout vorrei ma avuto problemi che non mi ricordo perfettamente. Tuttavia, che sarebbe il posto di modificare, in modo tale che max del pulsante venga rispettato

  2. hmmm ... non del tutto sicuro di come è stato implementato il cambiamento del cursore. Supponendo che è nel vostro ButtonProvider: implementare la isRolloverEnabled di restituire true / false a seconda che esso sia visibile o no Modifica-in-Modifica non funziona. Non so perché, potrebbe essere che si tratta di un bug in rollover-Dectection e / o manipolazione in WrappingProvider

Disattiva nel fine settimana ora: -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top