Swingx fornitore di componenti: nascondere componente alcune righe
-
26-10-2019 - |
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.
-
E 'possibile nascondere il componente reso su alcune righe (a seconda del valore, per esempio)? Impostazione
setVisible(false)
sulla componente reso informat()
oconfigureState()
non funziona. -
E 'possibile creare una sottoclasse ComponentProvider per fornire diversi diversi tipi di componenti? Se sì, come vorrei che il lavoro?
-
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()
eformat()
)?
Modifica
-
E 'possibile evitare che un JButton visualizzato in una JX (Albero)? Tabella di essere largo quanto il cellulare?
-
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!
Soluzione
Interessante: -)
- 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).
-
(2 nell'interrogazione) non supportato, il componentProvider è progettato per restituire la stessa componente singolo configurato con le stesse proprietà su ogni chiamata ??p>
-
(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)
-
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
-
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: -)